用python代替c++读取二进制文件
alternative reading binary in python instead of 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是double。但是,实际上变量的类型是整数,但通常我们在c++中使用"%d"输出。真奇怪。
2)如何在python中提取实数我想提取一个实数像上面的c++代码在python代码。我怎么知道??
也许,我误解了python中的struct模块
由于您已经能够使用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。我无法复制你用d
格式解码的结果,因为我猜不出你的文件中最后一位数字之后是什么…
如果数字在第一行是单独的,则很容易:只需读取一行并将其转换为int:
with open("../data/vec.bin","rb") as f:
print int(f.readline())
如果最后一位数字后有其他字符,则必须首先使用regex(不要忘记导入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:不要试图读取包含二进制表示的文本文件
在C格式字符串中,%d
是decimal的缩写。
在Python中,d
是double的缩写。
如果它是一个整数,你应该在struct.unpack
调用中使用i
。
with open("../data/vec.bin","rb") as f:
b = f.read()
print struct.unpack("i",b)[0]
相关文章:
- 正在读取二进制文件(is_open)
- 读取二进制文件并解释为整数
- 读取二进制文件直到结束 c++
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?
- 读取二进制文件的惯用C++17标准方法是什么
- 从末尾读取二进制文件
- C++逐个字符读取二进制文件字符
- 读取二进制文件大小的短自上周以来停止工作
- 读取二进制文件时出现问题
- 读取二进制文件时如何输出?
- C++:如何在线程中读取二进制文件并将其写入另一个线程?
- 在C 中读取二进制文件会返回意外值
- 尝试读取二进制文件会清除文件本身
- C 读取二进制文件
- 通过C 读取二进制文件的问题
- ifstream读取二进制文件在发行模式下工作,但在调试模式下不使用
- 分段 追加和读取二进制文件时出错
- 使用C++中的MsgPack读取二进制文件
- 有没有一种优雅的方法来读取二进制文件并将其内容复制到向量<int>
- 如何读取二进制文件并在屏幕上打印 3?