无法从 python 中的二进制文件中读取正确的值
Not able to read the correct values from a binary file in python
我创建了双精度(数据类型)值并将其写入二进制文件。该文件不包含任何 headers。它只是使用 Qt 中的 QDataStream 将原始数据写入文件。我正在尝试读取 python(版本 3.6.9)脚本中的值,但是,在 python 脚本中读取的数据不正确。在 C++ 中读取相同的文件时会给出正确的数据值。我的 python 代码是:
with open("cont_points.dat", mode='rb') as f:
controlP=np.fromfile(f,dtype=np.double)
print(controlP)
最后的 print 语句给出了以下结果,我假设这些结果全为零:
[2.11855e-320 1.04347e-320 0.00000e+000 3.03865e-319 2.11855e-320
2.05531e-320 0.00000e+000 3.03865e-319 1.61263e-320 1.04347e-320
... ... ...
2.05531e-320 0.00000e+000 3.03865e-319 2.05531e-320 1.04347e-320
0.00000e+000 3.03865e-319 2.05531e-320 2.05531e-320 0.00000e+000
3.03865e-319]
文件中的数据为[-4, 3, 0, 1, -4, 4, 0, 1, -3.5, 3, 0, 1,...等]。总共有 136 个值我想阅读。当我在 C++ 中读取相同的文件时得到正确的结果,我认为问题出在我的 python 代码中。谁能告诉我我做错了什么?
问题在于文件中数据的字节序。 QDataStream
默认使用大端字节顺序。在您的系统上,numpy 使用小端。您可以使用 dtype='>f8'
.
读取文件
这将生成一个具有 non-native 字节顺序的数组(controlP.dtype.isnative
将是 False
)。根据接下来发生的情况,您可能希望先调用 .byteswap()
以获得更好的性能。另见 this page in the numpy docs.
我创建了双精度(数据类型)值并将其写入二进制文件。该文件不包含任何 headers。它只是使用 Qt 中的 QDataStream 将原始数据写入文件。我正在尝试读取 python(版本 3.6.9)脚本中的值,但是,在 python 脚本中读取的数据不正确。在 C++ 中读取相同的文件时会给出正确的数据值。我的 python 代码是:
with open("cont_points.dat", mode='rb') as f:
controlP=np.fromfile(f,dtype=np.double)
print(controlP)
最后的 print 语句给出了以下结果,我假设这些结果全为零:
[2.11855e-320 1.04347e-320 0.00000e+000 3.03865e-319 2.11855e-320
2.05531e-320 0.00000e+000 3.03865e-319 1.61263e-320 1.04347e-320
... ... ...
2.05531e-320 0.00000e+000 3.03865e-319 2.05531e-320 1.04347e-320
0.00000e+000 3.03865e-319 2.05531e-320 2.05531e-320 0.00000e+000
3.03865e-319]
文件中的数据为[-4, 3, 0, 1, -4, 4, 0, 1, -3.5, 3, 0, 1,...等]。总共有 136 个值我想阅读。当我在 C++ 中读取相同的文件时得到正确的结果,我认为问题出在我的 python 代码中。谁能告诉我我做错了什么?
问题在于文件中数据的字节序。 QDataStream
默认使用大端字节顺序。在您的系统上,numpy 使用小端。您可以使用 dtype='>f8'
.
这将生成一个具有 non-native 字节顺序的数组(controlP.dtype.isnative
将是 False
)。根据接下来发生的情况,您可能希望先调用 .byteswap()
以获得更好的性能。另见 this page in the numpy docs.