如何在Python中将双精度浮点数保存到文件?

3

假设我需要保存一个矩阵(每行对应一行), 以便之后可以在Fortran中加载。我应该选择哪种方法?是将所有内容转换为字符串的唯一方法吗?


感谢所有回复的人。对于内部Python使用,我发现pickle是保存数据的最佳方法(目前对我来说已经足够了)。当我需要与Fortran进行连接时,我首先尝试花更多时间在结构化方法上,如果失败了,我会在重写Fortran脚本或在Fortran中解析文本之间做出决定。我怀疑Fortran是否支持JSON。 - hahahaha
很遗憾,FORTRAN 没有 JSON 解析器。 :-( - fviktor
我在我的博客里写了一篇关于这个问题的文章。 http://alcworx.blogspot.com/2010/10/transferring-data-from-fortran-to.html - alcworx
4个回答

6
你也可以以二进制格式保存它们。请参阅struct标准模块的文档,其中有一个pack函数用于将Python对象转换为二进制数据。
例如:
import struct

value = 3.141592654
data = struct.pack('d', value)
open('file.ext', 'wb').write(data)

你可以将矩阵的每个元素转换并写入文件中。Fortran应该能够加载这些二进制数据。你可以通过整行转换来加快此过程,例如:
row_data = struct.pack('d' * len(matrix_row), *matrix_row)

请注意,对于您的矩阵大小,'d' * len(matrix_row)是一个常数,因此您只需要计算一次该格式字符串。

2

我不懂Fortran,所以很难说哪些解析方式对你来说更容易。

听起来你的选择要么是将double类型保存为文本(也就是将其“转换”为字符串),要么是保存为二进制(使用struct等)。决定哪种方式更好取决于具体情况。

我会选择文本方式,因为这样文件可以轻松阅读,而且你不必处理各种细节(例如大小端字节序、默认double类型大小) 。但是,有些情况下二进制方式更好(例如,如果你有一个非常大的double列表并且空间很重要,或者如果解析更容易且你需要进行优化),但这可能不适用于你的情况。


1

你可以使用JSON

import json
matrix = [[2.3452452435, 3.34134], [4.5, 7.9]]
data = json.dumps(matrix)
open('file.ext', 'wb').write(data)

文件内容将会是:

[[2.3452452435, 3.3413400000000002], [4.5, 7.9000000000000004]]

JSON(JavaScript对象表示法)是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。http://json.org/ - Juanjo Conti
不打算点踩,但我认为在这里使用JSON并不是最好的格式。 - ChristopheD

1

如果可读性和易于访问很重要(且文件大小合理),Fortran可以轻松解析一个简单的数字数组,至少如果它事先知道矩阵的大小(使用类似READ(FILE_ID,'2(F)')的东西):

1.234  5.6789e4
3.1415 9.265358978
42     ...

在你的Python代码中,两个嵌套的for循环可以轻松地将矩阵写成这种形式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接