如何一次解包多个数字

8 投票
2 回答
18066 浏览
提问于 2025-04-17 08:08

我想把一堆打包好的整数放进一个文件里,比如:

for i in int_list:
    fp.write(struct.pack('<I', i))

现在我想把它们读出来放到一个整数列表(int_list)里。我可以这样做,但感觉效率不高:

data = fp.read()
int_list = []
for i in xrange(0, len(data), 4):
    int_list.append(struct.unpack('<I', data[i:i+4])[0])

有没有更高效的方法呢?

2 个回答

27

你可以在两个方向上都更有效率地做到这一点:

>>> import struct

>>> int_list = [0, 1, 258, 32768]
>>> fmt = "<%dI" % len(int_list)
>>> data = struct.pack(fmt, *int_list)
>>> data
'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x01\x00\x00\x00\x80\x00\x00'

>>> # f.write(data)
... # data = f.read()
...

>>> fmt = "<%dI" % (len(data) // 4)
>>> new_list = list(struct.unpack(fmt, data))
>>> new_list
[0, 1, 258, 32768]
5

array.array 这个东西在处理这个问题时应该会很快。你可以指定它里面包含的元素类型——对于整数来说,有几种选择(不过如果我没理解错的话,只有在机器的字节序下可以使用),然后你可以用它的 fromfile 方法直接从文件中读取数据。

撰写回答