Python中高效的变长字节字符串迭代

0 投票
1 回答
1298 浏览
提问于 2025-04-16 15:45

我正在用Python读取一个很大的二进制文件(500MB),并逐字节解析成Python的数据结构。这个文件代表了一个稀疏数据网格。根据格式的不同,有时候我需要一次读取一个字节、两个字节或四个字节。由于一些规定,我必须用Python来做,而不能用C语言。

我在寻找一些在Python中高效的运行机制来完成这个任务。下面是我现在正在做的一个简化示例:

with open(filename,'rb') as inFile:
 nCoords = struct.unpack('!i',inFile.read(4))[0]
 for i in range(nCoords):
    coord = (struct.unpack_from('!h',inFile.read(2))[0],struct.unpack_from('!h',inFile.read(2))[0]) # x, y coord
    nCrops = struct.unpack_from('!B',inFile.read(1))[0] #n crops
    for j in range(nCrops):
        cropId = struct.unpack_from('!B',inFile.read(1))[0] #cropId

我在想,把文件从磁盘加载到一个字符串中,然后从这个字符串中解析出来,是否会比一次读取几个字节更高效。比如说:

with open(filename,'rb') as inFile:
   wholeFile = inFile.read()

但我怀疑在wholeFile上使用数组切片会比我现在的做法更高效。

在Python中有没有一种高效的机制,可以把文件读入一个字符串,然后每次读取几个字节?(我查过StringIO,它只允许一次读取一行,这在这种情况下不适用,因为整个文件就是一行)。

1 个回答

7

mmap 是一个Python库,用来处理内存映射文件的工具。

撰写回答