2011-12-11 160 views
3

struct.unpack很多數字我想放一堆包裝整數到一個文件中,例如:怎樣才能一次

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]) 

是否有更有效的方法來做到這一點?

回答

5

array.array應該對此很快。你可以指定它包含的元素的類型 - 有少數整數(儘管IIUC僅限於機器字節順序),然​​後使用它的fromfile方法直接從文件中讀取。

+1

的OP希望他的數據是小端(<)32位(I)的整數。你需要測試一下機器是否是big-endian,如果是這樣的話,可以'your_array.byteswap()+1 –

15

您可以在兩個方向上更有效地做到這一點:

>>> 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] 
+1

更直接的回答:) –