如何将用LittleEndian编写的二进制文件读取到python中



我有一些从物理模拟中编写的数据,我正试图将其读取到python中。数据在.raw文件中,但我被告知它是用LittleEndian二进制编码的。您可以在此处找到数据:https://drive.google.com/file/d/1yp-Virpt2cFE1fRoX6NCt2gR2I3LyTaA/view?usp=sharing数据应为120x60值,约为9e-4。

我尝试过使用numpy.genfromtxt,但更改数据类型会更改值,并且找不到具有正确值的数据类型。

我试过使用这个代码:

import struct
file = open(path_to_data, 'rb')
data = struct.unpack('float', file.read())

但我得到的错误是bad char in struct format。我尝试使用<4而不是float,然后我得到了struct needs a buffer of 32 bytes的错误。

我不懂二进制编码,也不经常使用它,有人对如何读取这些数据有什么建议吗?

您的数据文件有28800字节长。如果是120x60个值,则所有值的长度为28800/(120*60(=4个字节。

通常,在阅读文件之前,有几个问题需要回答。

  • 是120行x 60列还是相反
  • 数据是先存储行还是先存储列
  • 我们知道数据点是四个字节,但它们是float还是int

但是查看文件,所有值似乎都是相同的:

> hd x19_rho_N2-0
00000000  fa ed 6b 3a fa ed 6b 3a  fa ed 6b 3a fa ed 6b 3a  |..k:..k:..k:..k:|
*
00007080

根据你的问题,我假设它们是按小端序排列的float

In [2]: with open("x19_rho_N2-0", "rb") as binary_file:
...:     bdata = binary_file.read()
...:     

由于我们不知道行/列的顺序,只需将它们读取到列表中即可:

In [4]: import struct
In [5]: result = [r[0] for r in struct.iter_unpack("<f", bdata)];
In [6]: len(result)
Out[6]: 7200

这产生了7200个值,但它们都是一样的:

In [7]: set(result)
Out[7]: {0.0008999999845400453}

如果您知道数据的形状,您可以读取该形状的数据:

In [10]: result2 = [r for r in struct.iter_unpack("<60f", bdata)];
In [11]: len(result2)
Out[11]: 120

In [14]: result3 = [r for r in struct.iter_unpack("<120f", bdata)];
In [15]: len(result3)
Out[15]: 60
In [16]: len(result3[0])
Out[16]: 120

您可以将其读取为numpy阵列,如下所示:

In [2]: import numpy as np
In [3]: result = np.fromfile("x19_rho_N2-0", "<f")
Out[3]: array([0.0009, 0.0009, 0.0009, ..., 0.0009, 0.0009, 0.0009], dtype=float32)