如何在Python中将双精度数保存到文件?
假设我需要保存一个矩阵(每一行对应一行数据),以后可以从Fortran中加载。那我应该用什么方法呢?把所有数据都转换成字符串是唯一的办法吗?
4 个回答
1
如果可读性和访问方便很重要(而且文件大小也合适),Fortran可以很容易地解析一个简单的数字数组,前提是它事先知道矩阵的大小(用类似READ(FILE_ID, '2(F)')的方式)。
1.234 5.6789e4
3.1415 9.265358978
42 ...
在你的Python代码中,使用两个嵌套的for循环可以轻松地将你的矩阵写成这种形式。
2
我不太懂Fortran,所以不太清楚你在那边解析数据时,什么对你来说比较简单。
听起来你有两个选择:要么把双精度浮点数以纯文本的形式保存(也就是把它们“转换”成字符串),要么以二进制的形式保存(使用struct
之类的)。选择哪种方式更好,得看具体情况。
我个人会选择纯文本的方式,因为这样文件更容易阅读,而且你不需要去处理各种复杂的细节(比如字节序、默认的双精度大小)。
不过,有些情况下二进制保存会更好(比如你有一大堆双精度浮点数,空间很重要,或者解析起来对你来说更简单,并且你需要优化)——但这可能不适合你的情况。
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)
是根据你的矩阵大小计算出来的常量,所以你只需要计算这个格式字符串一次。