C程序将连续的双打吐出到二进制文件中。我希望将它们读成Python。我尝试使用struct.unpack('d',f.read(8))
编辑: 我在C中使用以下内容来编写随机双数
r = drand48();
fwrite((void*)&r, sizeof(double), 1, data);
错误现在已修复,但我无法读取第一个值。对于所有0.000 ..数字,它将其读作3.90798504668055,但其余的都没问题。
答案 0 :(得分:3)
我认为你实际上正在正确阅读这个数字,但却被显示屏搞糊涂了。当我从你提供的文件中读取数字时,我得到“3.907985046680551e-14
” - 这几乎是不完全为零(扩展形式为0.000000000000039)。我怀疑你的C代码只是以比python更低的精度打印它。
[编辑]我刚尝试用C读取文件,得到相同的结果(虽然精度略低:3.90799e-14)(使用printf(“%g”,val)),所以我认为如果这个值不正确,那就发生在写作方面,而不是阅读。
答案 1 :(得分:1)
请您详细说明“没有用”?命令崩溃了吗?数据出错了吗?实际发生了什么?
如果命令崩溃:
如果数据出错了:
创建和读取数据的系统是否具有相同的字节顺序?如果一个是big-endian,另一个是little-endian,那么你需要在格式字符串中指定一个字节序转换。
如果两台计算机的字节顺序相同,那么数据是如何写入文件的,完全?你知道吗?如果你这样做,那么写入文件的值是多少,你得到的值是多少?
答案 2 :(得分:1)
首先,你试过pickle吗? 还没有人展示过任何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))
答案 3 :(得分:0)
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,)
答案 4 :(得分:-1)
最佳方法是使用ASCII文本文件:
0.0
3.1416
3.90798504668055
因为它可以移植并且在某种程度上适用于任何类型的浮点实现。
从double
的内存地址读取原始二进制数据根本不可移植,并且在某些不同的实现中一定会失败。
当然,您可以使用二进制格式来实现紧凑性,但是以该格式编写的便携式C函数看起来根本不像您的代码段。
至少,代码应该被一系列ifs / ifdef包围,检查当前机器使用的double
的内存表示与Python解释器预期的内存表示完全匹配。
编写这样的代码会很困难,这就是为什么我建议使用简单,干净,可移植和人类可读的ASCII文本解决方案。
这将是我对“最佳”的定义。