AC 程序将连续的双精度数输出到二进制文件中。我希望将它们读入 Python。我尝试使用struct.unpack('d',f.read(8))
编辑:我在 C 中使用以下内容编写了一个随机双数
r = drand48();
fwrite((void*)&r, sizeof(double), 1, data);
错误现在已修复,但我无法读取第一个值。对于全 0.000.. 数字,它读取为 3.90798504668055,但其余的都很好。
我认为您实际上是在正确读取数字,但对显示感到困惑。当我从您提供的文件中读取数字时,我得到“ 3.907985046680551e-14
” - 这几乎是但不完全为零(0.000000000000039 的扩展形式)。我怀疑您的 C 代码只是以低于 python 的精度打印它。
[编辑] 我刚刚尝试在 C 中读取文件,我得到了相同的结果(虽然精度稍低:3.90799e-14)(使用 printf("%g", val)),所以我认为如果这个值是不正确的,它发生在写作方面,而不是阅读方面。
您能否详细说明“没有工作”?命令崩溃了吗?数据出来错了吗?究竟发生了什么?
如果命令崩溃:
如果数据只是错误地出现:
创建和读取数据的系统是否具有相同的字节顺序?如果一个是大端,另一个是小端,那么您需要在格式字符串中指定字节顺序转换。
如果两台计算机的字节序相同,那么数据究竟是如何写入文件的?你知道吗?如果你这样做了,那么写入文件的值是什么,你得到的错误值是什么?
首先,你试过泡菜吗?还没有人展示任何 Python 代码......这是一些用于在 python 中读取二进制文件的代码:
import Numeric as N
import array
filename = "tmp.bin"
file = open(filename, mode='rb')
binvalues = array.array('f')
binvalues.read(file, num_lon * num_lat)
data = N.array(binvalues, typecode=N.Float)
file.close()
这里的 f 指定单精度、4 字节浮点数。找到每个条目的数据大小并使用它。
对于非二进制数据,您可以执行以下简单操作:
tmp=[]
for line in open("data.dat"):
tmp.append(float(line))
f.read(8)
可能返回少于 8 个字节数据可能有不同的对齐方式和/或字节序:
>>> for c in '@=<>':
... print repr(struct.pack(c+'d', -1.05))
...
'\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
'\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
'\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
'\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd'
>>> struct.unpack('<d', '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd')
(-6.0659880001157799e+066,)
>>> struct.unpack('>d', '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd')
(-1.05,)
最好的方法是使用 ASCII 文本文件:
0.0
3.1416
3.90798504668055
因为它是可移植的,并且在一定程度上可以与任何类型的浮点实现一起使用。
从 a 的内存地址读取原始二进制数据double
根本不可移植,并且在某些不同的实现中必然会失败。
您当然可以使用二进制格式来保持紧凑性,但是以这种格式编写的可移植 C 函数看起来根本不像您的代码片段。
至少,代码应该被一系列 ifs/ifdefs 包围,检查double
当前机器使用的 s 的内存表示是否与 Python 解释器所期望的完全匹配。
编写这样的代码会很困难,这就是为什么我建议使用简单、干净、可移植和人类可读的 ASCII 文本解决方案。
这就是我对“最好”的定义。