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

Python 使用numpy.fromfile读取分散的二进制数据,python,numpy,binary,records,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

我希望使用单个调用
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..
我知道我想要的数据和无用数据之间的字节增量。我还知道我想要的每个数据块的大小

到目前为止,我已经通过在file对象
f
上查找并调用以下命令实现了我的目标:

nparr = np.fromfile(f,dtype=OES,count=size)
因此,对于我想要的每个数据块,我有一个不同的
nparr
,并将所有
numpy
数组连接到一个新数组中

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

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

不,只需调用一次
fromfile()

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

file_positions = [position1, position2, ...]
numrecords = [n1, n2, ...]
然后您可以这样做(假设
f
是已打开的文件):

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

不,只需调用一次
fromfile()

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

file_positions = [position1, position2, ...]
numrecords = [n1, n2, ...]
然后您可以这样做(假设
f
是已打开的文件):


非常感谢你!我也在考虑这个问题。我对如何管理内存有点模糊。这不会导致np.fromfile和nparr的内存重复吗?nparr子集是np.fromfile的视图吗?还是复印件?根据我的测试,这样的项目分配似乎是在复制。但我可能错了。谢谢你的建议。对于每个块,
fromfile(f,count=n,dtype=OES)
将创建一个长度为
n
的数组。然后该数组将被复制到
nparr
中的适当范围。由
fromfile
创建的数组没有分配给其他任何地方,因此它的内存可以被python重用。你是说不可用?根据我对python垃圾收集器的阅读,如果这就是你的意思的话,那就很有意义了。我的意思是可用,因为垃圾收集器可以接管并重用内存。非常感谢!我也在考虑这个问题。我对如何管理内存有点模糊。这不会导致np.fromfile和nparr的内存重复吗?nparr子集是np.fromfile的视图吗?还是复印件?根据我的测试,这样的项目分配似乎是在复制。但我可能错了。谢谢你的建议。对于每个块,
fromfile(f,count=n,dtype=OES)
将创建一个长度为
n
的数组。然后该数组将被复制到
nparr
中的适当范围。由
fromfile
创建的数组没有分配给其他任何地方,因此它的内存可以被python重用。你是说不可用?根据我对python垃圾收集器的阅读,如果这就是你的意思,那就很有意义了。我的意思是可用,因为垃圾收集器可以接管并重用内存。