2

昨日のポスターの素晴らしいアドバイスに従って、私は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)

また、新しく作成されたオブジェクトがソースファイルよりも大幅に小さいこともわかります。

4

1 に答える 1

6

すでにお気づきのように、ファイルはバイナリモードで開く必要があります。open(srcfile, "rb")およびopen(destfile, "wb+")。それ以外の場合、Pythonはファイルがテキストファイルであると想定し、プラットフォームに応じて改行変換を行う場合があります(詳細についてはチュートリアルを参照してください)。

于 2012-05-16T21:51:15.050 に答える