Python读取二进制文件:如何解压大量数字?

时间:2013-03-31 04:28:39

标签: 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()

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:3)

struct支持计数的格式,例如以下代码将解包100个双打:

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

如果你正在处理大量的双打,我建议你使用numpy:

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

将从文件中创建一个100双数组。