昨日のポスターの素晴らしいアドバイスに従って、私はshutil.copyfileobj
ファイルのコピーを作成する方法を使い始めました。
私のプログラムは、ファイルの正確なコピーを作成し、最後のバイトを削除して、新しいコピーを保存する必要があります。
昨夜、いくつかの非常に小さなASCIIテキストファイルでテストしたので、私が求めたとおりに動作していることを確認できました。今朝、実際の「複雑な」ファイル、PDF、JPGで試しましたが、コピーのように見えます。関数は真のコピーを作成していません。結果のファイルを16進エディターで調べたところ、〜offset 0x300の後に、データが追加されているか、コピー時にデータが変更されているという奇妙なことが起こっていることがわかります。どちらかわかりません。
私のプログラムは繰り返しバイトを取り出して新しいバージョンを保存しますが、新しく作成されたファイルは元のファイルとは一貫して異なっていることがわかります(最後のバイトを除く)
def doNibbleAndSave(srcfile,fileStripped,strippedExt,newpath):
counter = '%(interationCounter)03d' % {"interationCounter":interationCounter} #creates the filename counter lable
destfile = newpath + "\\" + fileStripped + "_" + counter + strippedExt #creates the new filename
with open(srcfile, 'r') as fsrc:
with open(destfile, 'w+') as fdest:
shutil.copyfileobj(fsrc, fdest)
fdest.seek(nibbleSize, os.SEEK_END) #sets the number of bytes to be removed
fdest.truncate()
srcfile = destfile #makes the iterator pick up the newly 'nibbled' file to work on next
return (srcfile)
また、新しく作成されたオブジェクトがソースファイルよりも大幅に小さいこともわかります。