Python:将二进制文件解压缩成二维数组并给出长度错误

Posted

技术标签:

【中文标题】Python:将二进制文件解压缩成二维数组并给出长度错误【英文标题】:Python: Unpacking binary file into a 2-d array and giving a length error 【发布时间】:2016-05-25 15:33:55 【问题描述】:

我正在尝试以二进制格式从文件中读取数据并将其存储在二维数组中。但是,我收到一条错误消息,内容为

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

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

【问题讨论】:

【参考方案1】:

事实证明,当一次读取 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 有效。

【讨论】:

以上是关于Python:将二进制文件解压缩成二维数组并给出长度错误的主要内容,如果未能解决你的问题,请参考以下文章

将二维数组压缩成一维数组

Python将值行解压缩为两个数组

将 bz2 压缩二进制文件导入为 numpy 数组

用python处理csv文件,最好可以将里面的文本信息转成一个二维数组的形式,具体如下

webservice(axis)接口上传文件附件 及 用zlib解压缩

如何在 ruby​​ 中解压缩大于 64 位的数字?