我希望使用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)
一次。有没有办法实现这个目标?
答案 0 :(得分:2)
也就是说,我想只召唤一次
nparr = np.fromfile(f,dtype=OES)
。有没有办法实现这个目标?
不,只需拨打一次fromfile()
。
但是如果您事先知道文件的完整布局,则可以预先分配数组,然后使用fromfile
和seek
将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