numpy 用C++编写二进制文件并在Python中读取

4c8rllxm  于 2023-06-06  发布在  Python
关注(0)|答案(3)|浏览(392)

我想使用c将一系列数字存储到二进制文件中,以便稍后使用python打开。目前我有以下c脚本,名为 *writer.cpp:

#include <fstream>

int main()
{
  std::ofstream outFile;
  outFile.open("binaryFile.bin", std::ios::binary);
  int number = 0;
  for (int i=0; i<10; i++){
    number += i;
    outFile.write(reinterpret_cast<const char*>(&number), sizeof(int));
  }
  outFile.close();

  return 0;
}

当编译为

g++ -o writerTest.x writer.cpp

并运行为

./writerTest.x

生成名为“binaryFile.bin”的二进制文件。
然后,我尝试使用Python和以下名为 reader.py 的脚本来读取它:

import numpy as np
from sys import argv

path = str(argv[1])
x = np.fromfile(path)
print x, type(x)

将其作为python reader.py binaryFile.bin运行会产生以下结果

[  2.12199579e-314   1.27319747e-313   3.18299369e-313   5.94158822e-313
9.54898106e-313] <type 'numpy.ndarray'>

这显然不是我所希望的。我做错了什么,应该如何正确地做到这一点?

beq87vna

beq87vna1#

您必须指定要阅读的值的类型,numpy无法猜测,因为文件本身没有存储元数据。所以在你的情况下,你必须做这样的事情:

x = np.fromfile(path, dtype=int)

如果你正在做这样的事情,强烈建议使用固定大小的整数,而不仅仅是int,例如。在C++中,可以从<cstdint>使用int32_t,在Python中,可以将int32指定为dtype。

e5nqia27

e5nqia272#

fromfile默认采用浮点数。如果你想改变这种行为,你需要在dtype命名参数中传递类型。
当你在写int时,这个 * 应该 * 工作:

x = np.fromfile(path, dtype=int)
r7knjye2

r7knjye23#

下面是一个示例代码,展示了如何在C中编写二进制数据并在Python中读取它:
在C中:

#include <stdio.h>
#include <stdlib.h>

int main() {
   int data[5] = {10, 20, 30, 40, 50};
   FILE * fp;

   fp = fopen ("test.bin", "wb");
   fwrite(data, sizeof(int), 5, fp);
   fclose (fp);

   return 0;
}

在Python中:
使用open('test.bin','rb')作为f:
B = f.read()data = list(struct.unpack('i ' *(len(b)// 4),b))print(data)
注意:这假设二进制数据包含整数。对于其他数据类型,您需要相应地修改代码。查看更多详情:https://letchatgpt.com/read-in-python-c-write-binary-file-from-vector/

相关问题