基本上我想读取一个包含大量双打的二进制文件。不知道如何实现以下目标:
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()
基本上我想读取一个包含大量双打的二进制文件。不知道如何实现以下目标:
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 字节通常是理想的)并创建一个编译的结构——但这是一般的想法。如果性能特别重要,您还可以一次解压缩多个双精度数(例如,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))
struct 支持计数的格式,例如以下代码将解包 100 个双精度:
import struct
struct.unpack("100d", string)
如果您正在处理大量双打,我建议您使用 numpy:
np.fromfile(f, dtype=float, count=100)
将从文件中创建一个 100 双数组。