基本上我想讀一個包含大量雙打的二進制文件。不知道如何實現以下目標:Python讀取二進制文件:如何解開大量數字?
N=10000000
fin=open("sth.bin","rb")
data = struct.unpack('dddddd......',fin.read(8*N)) #of course not working, but this is what I want
fin.close()
基本上我想讀一個包含大量雙打的二進制文件。不知道如何實現以下目標:Python讀取二進制文件:如何解開大量數字?
N=10000000
fin=open("sth.bin","rb")
data = struct.unpack('dddddd......',fin.read(8*N)) #of course not working, but this is what I want
fin.close()
遍歷文件,一次開箱大塊:
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個雙打
結構支持計數的格式,例如:
import struct
struct.unpack("100d", string)
,如果你正在處理大量的雙打,我建議你使用numpy的:
np.fromfile(f, dtype=float, count=100)
將創建一個100雙數組f的條件rom文件。
我認爲你的意思是'c'hunk不是大衛在這裏大衛:) –
呃,我更喜歡「大塊頭」,但無論如何!這一切都有效。 –