将整个二进制文件读入Python

8 投票
5 回答
19647 浏览
提问于 2025-04-16 08:25

我需要从Python中导入一个二进制文件,这个文件的内容是带符号的16位整数,采用大端格式。

在Stack Overflow上,有一些问题讨论了如何一次读取几个字节,但这样的方法能否扩展到读取整个文件呢?

我想创建一个像这样的函数:

from numpy import *
import os

def readmyfile(filename, bytes=2, endian='>h'):
    totalBytes = os.path.getsize(filename)
    values = empty(totalBytes/bytes)
    with open(filename, 'rb') as f:
        for i in range(len(values)):
            values[i] = struct.unpack(endian, f.read(bytes))[0]
    return values

filecontents = readmyfile('filename')

但是这样做速度很慢(这个文件有165924350个字节)。有没有更好的方法呢?

5 个回答

2

你现在是每次读取和解压缩2个字节的数据。

values[i] = struct.unpack(endian,f.read(bytes))[0]

那为什么不一次读取1024个字节呢?

10

使用 numpy.fromfile

4

我会直接读取直到文件结束(EOF),这意味着检查是否接收到一个空字符串,这样就不需要使用range()和getsize了。
另外,使用xrange(而不是range)应该会让事情变得更好,特别是在内存使用方面。
而且,正如Falmarri所建议的,一次读取更多的数据会大大提高性能。

不过,我也不指望会有奇迹发生,因为我不确定用列表来存储这么多数据是否是最有效的方式。
那用NumPy的数组怎么样?它有一些功能可以读取/写入二进制文件。在这个链接中,有一部分是关于使用numpyio.fread读取原始二进制文件的。我相信这正是你需要的。

注意:就我个人而言,我从来没有使用过NumPy;不过,它的主要目的就是处理大量数据——这正是你在问题中所做的。

撰写回答