使用numpy.fromfile读取分散的二进制数据

时间:2016-08-06 16:16:48

标签: python numpy binary records

我希望使用numpy.fromfile的单个调用来读取二进制文件中的不同块。每个块具有以下格式:

OES=[
('EKEY','i4',1), 
('FD1','f4',1),
('EX1','f4',1),
('EY1','f4',1),
('EXY1','f4',1),
('EA1','f4',1),
('EMJRP1','f4',1),
('EMNRP1','f4',1),
('EMAX1','f4',1),
('FD2','f4',1),
('EX2','f4',1),
('EY2','f4',1),
('EXY2','f4',1),
('EA2','f4',1),
('EMJRP2','f4',1),
('EMNRP2','f4',1),
('EMAX2','f4',1)]

这是二进制文件的格式:

 Data I want (OES format repeating n times)
 ------------------------
 Useless Data
 ------------------------
 Data I want (OES format repeating m times)
 ------------------------
 etc..

我知道我想要的数据和无用数据之间的字节增量。我也知道我想要的每个数据块的大小。

到目前为止,我已经通过在文件对象f上搜索然后调用来完成我的目标:

nparr = np.fromfile(f,dtype=OES,count=size)

因此,对于我想要的每个数据块,我有一个不同的nparr,并将所有numpy数组连接成一个新数组。

我的目标是拥有一个包含我想要的所有块的单个数组,而不需要连接(出于内存目的)。也就是说,我只想拨打nparr = np.fromfile(f,dtype=OES)一次。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

  

也就是说,我想只召唤一次nparr = np.fromfile(f,dtype=OES)。有没有办法实现这个目标?

不,只需拨打一次fromfile()

但是如果您事先知道文件的完整布局,则可以预先分配数组,然后使用fromfileseek将OES块直接读入预分配的数组。例如,假设您知道每个OES块的文件位置,并且您知道每个块中的记录数。也就是说,你知道:

file_positions = [position1, position2, ...]
numrecords = [n1, n2, ...]

然后你可以这样做(假设f是已打开的文件):

total = sum(numrecords)
nparr = np.empty(total, dtype=OES)
current_index = 0
for pos, n in zip(file_positions, numrecords):
    f.seek(pos)
    nparr[current_index:current_index+n] = np.fromfile(f, count=n, dtype=OES)
    current_index += n