我有一些从物理模拟中编写的数据,我正试图将其读取到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)