假设我需要保存一个矩阵(每行对应一行),以后可以从fortran加载。我应该选择哪种方法?将所有东西都转换成字符串是唯一的方法吗?如何在python中保存double文件?
回答
您也可以用二进制格式保存它们。请参阅struct
标准模块上的文档,它具有用于将Python对象转换为二进制数据的pack
函数。
例如:
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)
是你的矩阵大小恒定的,所以你需要计算一次该格式字符串。
我不知道fortran,所以很难判断你在解析的时候很容易做什么。
这听起来像是你的选择是以明文(意思是'将'转换成字符串'')或二进制文件(使用struct
等)来保存双精度。哪一个更好的决定取决于。
我会用纯文本解决方案,因为这意味着文件将易于阅读,并且您不必混淆不同类型的细节(endianity,默认双倍大小)。
但是,有些情况下二进制更好(例如,如果你有一个非常大的双打和空间列表是重要的,或者如果它更容易解析它,你需要优化) - 但这是可能不是你的情况。
您可以使用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 Object Notation)是一个轻量级的数据交换格式,人类很容易读写,机器很容易解析和生成。http://json.org/ – 2009-11-26 15:00:26
没有downvoting,但不认为JSON是最好的格式这里。 – ChristopheD 2009-11-26 15:53:23
如果访问的易读性和易用性是非常重要的(和文件大小是合理的),Fortran语言可以很容易地分析一个简单至少如果它事先知道矩阵的大小(类似于READ(FILE_ID,'2(F)'),我认为):
1.234 5.6789e4
3.1415 9.265358978
42 ...
在您的Python代码中嵌套for循环可以很容易地在这种形式写你的矩阵。
感谢所有回复的人。对于内部python使用,我发现pickle是保存数据的最佳方法(现在对我来说已经足够了)。当我需要与fortran连接时,我首先尝试在struct方法上花费更多时间,如果失败,我会决定在fortran中重写脚本或在fortran中解析文本。我怀疑fortran是否支持JSON。 – hahahaha 2009-11-26 16:32:39
对,不幸的是,FORTRAN似乎没有JSON解析器。 :-( – fviktor 2009-11-27 05:13:34
我已经在我的博客中写过关于此问题的帖子 http://alcworx.blogspot.com/2010/10/transferring-data-from-fortran-to.html – alcworx 2010-10-09 23:04:20