6

AC 程序将连续的双精度数输出到二进制文件中。我希望将它们读入 Python。我尝试使用struct.unpack('d',f.read(8))

编辑:我在 C 中使用以下内容编写了一个随机双数

r = drand48();
fwrite((void*)&r, sizeof(double), 1, data);

错误现在已修复,但我无法读取第一个值。对于全 0.000.. 数字,它读取为 3.90798504668055,但其余的都很好。

4

5 回答 5

2

我认为您实际上是在正确读取数字,但对显示感到困惑。当我从您提供的文件中读取数字时,我得到“ 3.907985046680551e-14” - 这几乎是但不完全为零(0.000000000000039 的扩展形式)。我怀疑您的 C 代码只是以低于 python 的精度打印它。

[编辑] 我刚刚尝试在 C 中读取文件,我得到了相同的结果(虽然精度稍低:3.90799e-14)(使用 printf("%g", val)),所以我认为如果这个值是不正确的,它发生在写作方面,而不是阅读方面。

于 2009-03-11T00:22:48.830 回答
1

您能否详细说明“没有工作”?命令崩溃了吗?数据出来错了吗?究竟发生了什么?

如果命令崩溃:

  • 请分享命令的错误输出

如果数据只是错误地出现:

  • 创建和读取数据的系统是否具有相同的字节顺序?如果一个是大端,另一个是小端,那么您需要在格式字符串中指定字节顺序转换。

  • 如果两台计算机的字节序相同,那么数据究竟是如何写入文件的?你知道吗?如果你这样做了,那么写入文件的值是什么,你得到的错误值是什么?

于 2009-03-10T18:24:38.253 回答
1

首先,你试过泡菜吗?还没有人展示任何 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))
于 2009-03-10T23:19:34.830 回答
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,)
    
于 2009-03-10T18:56:14.497 回答
0

最好的方法是使用 ASCII 文本文件:

0.0
3.1416
3.90798504668055

因为它是可移植的,并且在一定程度上可以与任何类型的浮点实现一起使用。

从 a 的内存地址读取原始二进制数据double根本不可移植,并且在某些不同的实现中必然会失败。

您当然可以使用二进制格式来保持紧凑性,但是以这种格式编写的可移植 C 函数看起来根本不像您的代码片段。

至少,代码应该被一系列 ifs/ifdefs 包围,检查double当前机器使用的 s 的内存表示是否与 Python 解释器所期望的完全匹配。

编写这样的代码会很困难,这就是为什么我建议使用简单、干净、可移植和人类可读的 ASCII 文本解决方案。

这就是对“最好”的定义。

于 2009-03-10T22:29:12.160 回答