我有一个二进制文件和C ++代码,可以读取如下的二进制文件。
int NumberOfWord;
FILE *f = fopen("../data/vec.bin", "rb");
fscanf(f, "%d", &NumberOfWord);
cout << NumberOfWord< <endl;
此输出为:
114042
我想在python中重新实现上面的代码。
with open("../data/vec.bin","rb") as f:
b = f.read(8)
print struct.unpack("d",b)[0]
但此代码无效。 我的输出是:
8.45476330511e-53
我的问题是:
1)为什么整数在C ++中有8个字节。
我从不知道%d意味着双倍。 但实际上变量的类型是整数,但通常我们使用&#34;%d&#34;在C ++中。 这很奇怪。
2)如何在python中提取实数
我想在python代码中提取像C ++代码一样的实数。 我怎么做?
也许,我在python中误解了struct模块。
答案 0 :(得分:1)
由于您已经能够使用此C ++(或更确切地说是C)行fscanf(f, "%d", &NumberOfWord);
正确读取文件,我假设您的文件包含114042的文本表示。因此它包含字节
0x31 0x31 0x34 0x30 0x34 0x32 ...
或'1', '1', '4', '0', '4', '2', ...
在文本编辑器中打开它时,您可以看到一行114042
。
现在,当您尝试读取是否为i
格式的二进制文件时,您使用文件的4个第一个字节并实际获得int('31313034', 16)
:825308208。我无法重现您使用{{{ 1}}格式将其解码为double,因为我无法猜到最后一位数字后文件中出现了什么......
如果数字在第一行是单独的,那很简单:只需读取一行并将其转换为int:
d
如果最后一个数字后面还有其他字符,则必须首先使用正则表达式(不要忘记导入with open("../data/vec.bin","rb") as f:
print int(f.readline())
)来获取数值,然后将其转换为int:
re
TL / DR:不要尝试读取文本文件,就像它包含二进制表示
一样答案 1 :(得分:0)
在C格式字符串中,%d
是十进制的缩写。
在Python中,d
是double的缩写。
如果是整数,则应在i
调用中使用struct.unpack
。
with open("../data/vec.bin","rb") as f:
b = f.read()
print struct.unpack("i",b)[0]