我有一个二进制文件和可以读取该二进制文件的 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 是双倍的。 但是,实际上变量的类型是整数,但通常我们在 C++ 中使用 "%d"输出。 这很奇怪。
2) 如何在 python 中提取实数
我想在 python 代码中提取一个实数,就像上面的 C++ 代码一样。 我该怎么做??
也许,我对python中的struct module有误解。
最佳答案
由于您已经能够使用此 C++(或更确切地说是 C)行 fscanf(f, "%d", &NumberOfWord);
正确读取文件,因此我假设您的文件包含114042 的文本表示。因此它包含字节
0x31 0x31 0x34 0x30 0x34 0x32 ...
或 '1', '1', '4', '0', '4', '2', ...
当您在文本编辑器中打开它时,您可以看到一行 114042
。
现在,当您尝试以 i
格式读取 if 二进制文件时,您使用文件的前 4 个字节并实际得到 int('31313034', 16)
: 825308208。我无法重现您使用 d
格式将其解码为 double 的内容,因为我无法猜测最后一位数字后您的文件中会出现什么...
如果数字单独出现在第一行,这很简单:只需读取一行并将其转换为 int:
with open("../data/vec.bin","rb") as f:
print int(f.readline())
如果最后一位数字后面还有其他字符,则必须先使用正则表达式(不要忘记导入 re
)来获取数值,然后将其转换为 int:
with open("../data/vec.bin","rb") as f:
line = f.readline()
m = re.match(t'\s*\d*', line)
print(int(m.group(0)))
TL/DR:不要试图读取文本文件,就好像它包含二进制表示一样
关于python - 在 python 而不是 C++ 中替代读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896826/