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垃圾收集器的阅读,如果这就是你的意思,那就很有意义了。我的意思是可用,因为垃圾收集器可以接管并重用内存。