2013-03-31 90 views

回答

5

遍歷文件,一次開箱大塊:

with open("sth.bin", "rb") as f: 
    numbers = [ 
     struct.unpack('d', chunk)[0] 
     for chunk in iter(lambda: f.read(8), "") 
    ] 

還有一堆的優化,你可以在這裏做的 - 讀取大文件的大塊一次(4096字節通常是理想的)並創建一個compiled Struct - 但這是一般的想法。如果性能是特別重要的,你也可以在同一時間(例如,struct.unpack('d' * 8, chunk))解壓多個雙打減少函數調用的次數:

numbers = [] 
struct_4096 = struct.Struct("d" * 4096/8) 
with open("sth.bin", "rb") as f: 
    while True: 
     chunk = f.read(4096) 
     try: 
      numbers.extend(struct_4096.unpack(chunk)) 
     except struct.error: 
      numbers.extend(struct.unpack("d" * len(chunk)/8)) 
下面的代碼將解壓縮100個雙打
+0

我認爲你的意思是'c'hunk不是大衛在這裏大衛:) –

+0

呃,我更喜歡「大塊頭」,但無論如何!這一切都有效。 –

3

結構支持計數的格式,例如:

import struct 
struct.unpack("100d", string) 

,如果你正在處理大量的雙打,我建議你使用numpy的:

np.fromfile(f, dtype=float, count=100) 

將創建一個100雙數組f的條件rom文件。

相關問題