在处理使用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))
也给了我一个空数组。我该如何解决这个问题?