2016-05-25 22 views
0

我试图从二进制格式的文件中读取数据并将其存储在二维数组中。但是,我得到读取Python:将二进制文件解压缩为二维数组并给出长度错误

error: unpack requires a bytes object of length 2 

错误本质上我有什么是一样的东西

import os, struct 
from itertools import chain 

packets = value1 #The number of packets in the data stream 
dataLength = value2 #bytes of data per packet 

packHeader = [[0 for x in range(14)] for y in range(packets)] 
data = [[0 for x in range(dataLength)] for y in range(packets)] 

for i in range(packets): 
    packHeader[i][0] = struct.unpack('>H', file.read(2)) 
    packHeader[i][1] = struct.unpack('>H', file.read(2)) 
    .... 
    packHeader[i][13] = struct.unpack('>i', file.read(4)) 
    packHeader[i]=list(chain(*packHeader[i])) #Deals with the tuple issue ((x,),(y,),...) -> (x,y,...) 
    for j in range(dataLength): 
     data[i][j] = struct.unpack('<h', file.read(2)) 

当到达这一点上,产生上述错误。我不知道为什么。 dataLengthpackets都是偶数。所以,想象一次解开2个字节应该不成问题。有什么想法吗?

编辑我没有检查看看如果我一次读入一个字节的数据会发生什么。所以

data[i][j] = struct.unpack('<b', file.read(1)) 

和那工作得很好。它只是不喜欢解开其他任何东西。

EDIT 2我也只是说干就干,作出更为简洁,就像这样,

data[i] = [struct.unpack('<h', file.read(2)) for j in range(dataLength)] 

仍然会产生同样的错误 - 只是更紧凑。

回答

0

事实证明,但仍有迭代来执行在时间在2个字节(或多个)读取时从该文件的数据被用完。解决方法是像做以下

readBytes = value_wanting_to_be_read 
dataLength = int(value2/readBytes) 

,然后在实际的循环

data[i] = [struct.unpack('<h', file.read(readBytes)) for j in range(dataLength)] 

如果readBytes = 2其中工程。