2011-07-07 110 views
3

在Python中編寫二進制文件時,我似乎缺少一些字節。我已經用「write」函數和「array.tofile」函數試過了。下面是一些示例代碼:編寫二進制文件時在Python中缺少字節?

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() 

提供了以下的輸出:

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

我不明白爲什麼這些字節不被寫入。我已經在多個文件中嘗試了這種方法,其中包含不同數量的丟失字節

+0

你能給我文件'strings.exe'的內容嗎?我無法用我的文件重現問題 – eyquem

回答

4

如果你真的試圖比較這兩個二進制文件(如果你在UNIX下使用cmp命令),你會看到兩個文件是相同的。

編輯:正如約翰在他的答案中指出的那樣,字節大小的差異是由於在測量其長度之前沒有關閉文件。代碼中的正確行應爲copyFile.close() [調用方法]而不是copyFile.close [這是方法對象]。

+0

是的,它們是相同的。使用cmp和md5sum,它們看起來是一樣的。應該首先檢查一下。是的,我相信它會與文件元數據相關。謝謝 – Froob

+0

元數據?? 「描述符的區別」? –

5

在調用os.path.getsize之前,您沒有關閉輸出文件。您寫入的135168字節是33 x 4096字節塊...嘗試copyFile.close()而不是copyFile.close

+0

明天將+1加入(今日可用投票結果不足)。我在我自己的答案中引用了這個。 – mac

+0

@mac:你的回答已經讓你獲得了55個不應得的分數 - 你爲什麼不刪除它而不是將我的答案複製到它呢? –

+0

問題是關於字節未被寫入,我正確地指出這兩個文件確實是相同的。我錯誤的是爲什麼python返回的大小是錯誤的(它實際上是一個假設的句子,而不是一個明確的「是因爲這個」),我改變了它的正確解釋,並引用了你和+ 1你的答案。如果你對此嫉妒,我當然可以刪除那一點答案。我只是認爲它對未來的訪問者更有用。讓我知道如果你想我刪除那一點! :) – mac

相關問題