python - 在 python 而不是 C++ 中替代读取二进制文件

标签 python c++

我有一个二进制文件和可以读取该二进制文件的 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/

相关文章:

python - 如何使用 itertools.groupby()?

python - 如何制作 Matplotlib 动画 fiddle 图?

python - 如何在 django 中过滤多对多字段的多个值的模型结果

c++ - C++写一个文件到指定路径

c++ - 死亡测试时错误的函数调用评估

python - 使用 Python Selenium 在输入字段中键入时出错

python - [x](y) 运算符到底是做什么的?

c++ - Clang 与 GCC 与 MSVC 中的 SFINAE 和可见性检查——哪个是正确的?

c++ - #define 和创建普通类型有什么区别?

c++ - (C/C++) 字符数组的大小