在不知道结构的情况下用 python 读取二进制文件
Reading binary file with python without knowing structure
我有一个包含 8000 个粒子位置的二进制文件。
我知道每个粒子值应该看起来像“-24.6151 ...”(我不知道我的程序给出的值的精度是多少。我猜它是双精度(?)。
但是当我尝试使用此代码读取文件时:
In: with open('.//results0epsilon/energybinary/energy_00004.dat', 'br') as f:
buffer = f.read()
print ("Lenght of buffer is %d" % len(buffer))
for i in buffer:
print(int(i))
我得到输出:
Lenght of buffer is 64000
10
168
179
43
...
我跳过了整个值列表,但如您所见,这些值与我的预期相去甚远。我想我有某种解码错误。
如有任何帮助,我将不胜感激:)
您现在正在打印的是 bytes
组成您的浮点数据。所以它作为数值没有意义。
当然,没有 100% 肯定的答案,因为我们没有看到您的数据,但我会尝试猜测:
您有 8000 个值要读取,文件大小为 64000。因此您可能有 double
个 IEEE 值(每个 8 个字节)。如果它 不是 IEEE,那你就完蛋了。
在这种情况下,您可以尝试以下操作:
import struct
with open('.//results0epsilon/energybinary/energy_00004.dat', 'br') as f:
buffer = f.read()
print ("Length of buffer is %d" % len(buffer))
data = struct.unpack("=8000d",buffer)
如果打印的数据是伪造的,则可能是字节顺序问题。因此,将 =8000
更改为 <8000
或 >8000
。
参考和packing/unpacking格式:https://docs.python.org/3/library/struct.html
我有一个包含 8000 个粒子位置的二进制文件。 我知道每个粒子值应该看起来像“-24.6151 ...”(我不知道我的程序给出的值的精度是多少。我猜它是双精度(?)。
但是当我尝试使用此代码读取文件时:
In: with open('.//results0epsilon/energybinary/energy_00004.dat', 'br') as f:
buffer = f.read()
print ("Lenght of buffer is %d" % len(buffer))
for i in buffer:
print(int(i))
我得到输出:
Lenght of buffer is 64000
10
168
179
43
...
我跳过了整个值列表,但如您所见,这些值与我的预期相去甚远。我想我有某种解码错误。
如有任何帮助,我将不胜感激:)
您现在正在打印的是 bytes
组成您的浮点数据。所以它作为数值没有意义。
当然,没有 100% 肯定的答案,因为我们没有看到您的数据,但我会尝试猜测:
您有 8000 个值要读取,文件大小为 64000。因此您可能有 double
个 IEEE 值(每个 8 个字节)。如果它 不是 IEEE,那你就完蛋了。
在这种情况下,您可以尝试以下操作:
import struct
with open('.//results0epsilon/energybinary/energy_00004.dat', 'br') as f:
buffer = f.read()
print ("Length of buffer is %d" % len(buffer))
data = struct.unpack("=8000d",buffer)
如果打印的数据是伪造的,则可能是字节顺序问题。因此,将 =8000
更改为 <8000
或 >8000
。
参考和packing/unpacking格式:https://docs.python.org/3/library/struct.html