2011-07-07 19 views
3

バイナリファイルをPythonで書くときに、いくつかのバイトが欠けているようです。私は "write"関数と "array.tofile"関数でこれを試しました。ここではいくつかのサンプルコードは、次のとおりです。これらのバイトが書き込まれていない理由を私は理解していないバイナリファイルを書き込むときにPythonのバイトがありませんか?

Reading data from: strings.exe 
Input File Size: 136592 
Document Size: 136592 
Output File Size: 135168 
Missing Bytes: 1424 

import zlib, sys, os, array 
from struct import unpack 
from array import array 


inputFile = 'strings.exe' 

print "Reading data from: ", inputFile 

print 'Input File Size:', os.path.getsize(inputFile) 

f = open(inputFile, 'rb') 
#compressedDocument = 

document = f.read() 
documentArray = array('c', document) 
print 'Document Size:', len(documentArray) 

copyFile = open('Copy of ' + inputFile, 'wb') 
documentArray.tofile(copyFile) 
#copyFile.write(document) 
copyFile.close 


print 'Output File Size:', os.path.getsize('Copy of ' + inputFile) 

print 'Missing Bytes:', os.path.getsize(inputFile) - os.path.getsize('Copy of ' + inputFile) 
f.close() 

は、次のような出力を提供します。私はさまざまな数の欠落したバイトで複数のファイルでこれを試しました。

+0

ファイル 'strings.exe'の内容を教えてください。私のファイルで問題を再現することはできません – eyquem

答えて

4

実際に2つのバイナリファイルを比較しようとすると(UNIXの場合はcmpコマンドを使用します)、2つのファイルが同じであることがわかります。

EDIT:Johnの答えで正しく指摘されているように、バイトサイズの違いは、ファイルの長さを測定する前にファイルを閉じないためです。コード内の正しい行は、copyFile.close [メソッドオブジェクトである]の代わりにcopyFile.close() [メソッドを呼び出す]である必要があります。

+0

彼らは同一です。使用されたcmpとmd5sumは同じように見えます。最初にそれを本当にチェックしてください。はい私はそれがファイルメタデータに関連すると信じています。ありがとうございます – Froob

+0

メタデータ?? "記述子の違い"? –

5

os.path.getsizeに電話する前に出力ファイルを閉じることはありません。書き込まれた135168バイトは33×4096バイトブロックです... copyFile.closeの代わりにcopyFile.close()を試してください。

+0

明日はこれを+1します(今日利用可能な票がなくなった)。私は自分の答えでこれを参照しました。 – mac

+0

@mac:あなたの答えはあなたに55点の不利な点をもたらしました。答えをコピーするのではなく、削除してみてはいかがですか? –

+0

質問は書かれていないバイトに関するもので、2つのファイルが本当に同じであることを正しく指摘しました。私が間違っていたのは、なぜpythonによって返されたサイズが間違っていたのかという理由でした(そして、実際には仮説文であり、決定的な "それが原因です")。そして、正しい説明で貼り付けて、あなたの答えを1 'あなたがそれについて嫉妬しているなら、私はもちろん、その答えのビットを削除することができます。私はそれが将来の訪問者にとってより有用であると考えて貼り付けました。あなたが私にそのビットを削除してもらいたいかどうか知らせてください! :) – mac

関連する問題