Как я могу struct.unpack много номеров одновременно - PullRequest
4 голосов
/ 11 декабря 2011

Я хочу поместить в файл несколько упакованных целых чисел, например ::10000

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 ]

23 голосов
/ 11 декабря 2011

Вы можете сделать это более эффективно в обоих направлениях:

>>> 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 голосов
/ 11 декабря 2011

array.array должно быть быстро для этого.Вы можете указать тип элементов, которые он содержит - есть несколько для целых чисел (хотя IIUC только в машинном порядке), а затем использовать его метод fromfile для чтения непосредственно из файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...