将整个二进制文件读入Python
我需要从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;不过,它的主要目的就是处理大量数据——这正是你在问题中所做的。