2016-05-25 11 views
0

バイナリ形式のファイルからデータを読み込み、2次元配列に格納しようとしています。しかし、私は私が持っているもの基本的にPython:バイナリファイルを2次元配列に展開して長さエラーを返す

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バイトをアンパックすることは問題ではないはずです。何かご意見は?

EDIT一度に1バイトずつデータを読み込むとどうなるか確認しました。したがって

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

とうまくいきました。それはただ他のものを解凍するのが好きではありません。

私もちょうど先に行って、まだ同じエラーが発生し

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

のようなものを言っているもう少しコンパクトに2 EDIT - ちょうどよりコンパクトに。

答えて

0

ファイルのデータが不足しているため、一度に2バイト(またはそれ以上)のデータを読み取るときに繰り返し実行されることがありました。修正はreadBytes = 2場合に動作し、実際のループ

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

で、次の

readBytes = value_wanting_to_be_read 
dataLength = int(value2/readBytes) 

、その後のような何かを行うことです。

関連する問題