2009-11-26 106 views
3

假设我需要保存一个矩阵(每行对应一行),以后可以从fortran加载。我应该选择哪种方法?将所有东西都转换成字符串是唯一的方法吗?如何在python中保存double文件?

+0

感谢所有回复的人。对于内部python使用,我发现pickle是保存数据的最佳方法(现在对我来说已经足够了)。当我需要与fortran连接时,我首先尝试在struct方法上花费更多时间,如果失败,我会决定在fortran中重写脚本或在fortran中解析文本。我怀疑fortran是否支持JSON。 – hahahaha 2009-11-26 16:32:39

+0

对,不幸的是,FORTRAN似乎没有JSON解析器。 :-( – fviktor 2009-11-27 05:13:34

+0

我已经在我的博客中写过关于此问题的帖子 http://alcworx.blogspot.com/2010/10/transferring-data-from-fortran-to.html – alcworx 2010-10-09 23:04:20

回答

6

您也可以用二进制格式保存它们。请参阅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)是你的矩阵大小恒定的,所以你需要计算一次该格式字符串。

2

我不知道fortran,所以很难判断你在解析的时候很容易做什么。

这听起来像是你的选择是以明文(意思是'将'转换成字符串'')或二进制文件(使用struct等)来保存双精度。哪一个更好的决定取决于。

我会用纯文本解决方案,因为这意味着文件将易于阅读,并且您不必混淆不同类型的细节(endianity,默认双倍大小)。
但是,有些情况下二进制更好(例如,如果你有一个非常大的双打和空间列表是重要的,或者如果它更容易解析它,你需要优化) - 但这是可能不是你的情况。

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]] 
+0

JSON(JavaScript Object Notation)是一个轻量级的数据交换格式,人类很容易读写,机器很容易解析和生成。http://json.org/ – 2009-11-26 15:00:26

+0

没有downvoting,但不认为JSON是最好的格式这里。 – ChristopheD 2009-11-26 15:53:23

1

如果访问的易读性和易用性是非常重要的(和文件大小是合理的),Fortran语言可以很容易地分析一个简单至少如果它事先知道矩阵的大小(类似于READ(FILE_ID,'2(F)'),我认为):

1.234 5.6789e4 
3.1415 9.265358978 
42  ... 

在您的Python代码中嵌套for循环可以很容易地在这种形式写你的矩阵。