1

基本上我想读取一个包含大量双打的二进制文件。不知道如何实现以下目标:

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

2 回答 2

5

遍历文件,一次解压块:

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))
于 2013-03-31T04:42:22.580 回答
3

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

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

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

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

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

于 2013-03-31T05:35:28.563 回答