使用struct pack在Python中编写和读取行数组(nx1)到二进制文件

时间:2016-08-20 07:12:04

标签: python arrays matlab numpy binary

在处理使用nx1写入二进制文件的struct.pack行向量时,我在写入和读取二进制文件时遇到了很多麻烦。文件结构如下所示(给定data类型的参数numpy.array

test.file
--------

[format_code = 3] : 4 bytes (the code 3 means a vector) - fid.write(struct.pack('i',3))
[rows] : 4 bytes (fid.write(struct.pack('i',sz[0])) where sz = data.shape
[cols] : 4 bytes (fid.write(struct.pack('i',sz[1]))
[data] : type double = 8 bytes * (rows * cols)

不幸的是,由于这些文件大多是用MATLAB编写的,我有一个可以读写这些字段的工作类,我只能编写行数(即使列也是如此,我也需要列只有= 1)。

我已经尝试了几种方法来打包data,在尝试解压缩时没有任何方法(假设我已经在{{fid打开了我的文件1}}并做了一些错误检查):

'rb'/'wb'

到目前为止,在阅读时,我的输出似乎已被随机事物增加。我不知道发生了什么。

我发现了另一个类似的问题,因此我写了这样的数据:

# write data
sz = data.shape
datalen=8*sz[0]*sz[1]
fid.write(struct.pack('i',3)) # format code
fid.write(struct.pack('i',sz[0])) # rows
fid.write(struct.pack('i',sz[1])) # columns

### write attempt ###
for i in xrange(sz[0]):
    for j in xrange(sz[1]):
        fid.write(struct.pack('d',float(data[i][j]))) # write in 'c' convention, so we transpose

### read attempt ###
format_code = struct.unpack('i',fid.read(struct.calcsize('i')))[0]
rows = struct.unpack('i',fid.read(struct.calcsize('i')))[0]
cols = struct.unpack('i',fid.read(struct.calcsize('i')))[0]
out_datalen = 8 * rows * cols # size of structure
output_data=numpy.array(struct.unpack('%dd' % out_datalen,fid.read(datalen)),dtype=float)

然而,当使用以下方式阅读时:

fid.write(struct.pack('%sd' % len(data), *data))

我的数组中什么都没有。

同样,只是这样做:

numpy.array(struct.unpack('%sd' % out_datalen,fid.read(datalen)),dtype=float)

并用以下方式阅读:

fid.write(struct.pack('%dd' % datalen, *data))

也给了我一个空数组。我该如何解决这个问题?

0 个答案:

没有答案