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

3 投票
4 回答
3940 浏览
提问于 2025-04-15 16:25

假设我需要保存一个矩阵(每一行对应一行数据),以后可以从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)是根据你的矩阵大小计算出来的常量,所以你只需要计算这个格式字符串一次。

撰写回答