Fortran I/O 格式¶
日期 | 2009-02-01(最后修改),2008-04-04(创建) |
---|
注意:您可能想使用 scipy.io.FortranFile 代替。
Fortran 程序写入的文件可以使用两种格式之一:格式化或非格式化。格式化文件以人类可读的格式写入,应该可以使用 numpy.fromfile 加载它们。非格式化文件使用 Fortran 标准未指定的二进制格式写入。在实践中,大多数编译器/运行时使用基于记录的格式,其中包含一个整数头,该头包含以字节为单位的记录长度,然后是记录本身,后面跟着一个整数尾部,其中包含前面以字节为单位的长度。
鉴于头和数据的精度和字节序未指定,在野外可能会看到大量可能的组合。 FortranFile 类可以处理其中许多。
以下是如何读取特定非格式化输出文件的示例。请注意 dtype 中表示头和尾部的 'i4' 元素。
读取 FORTRAN “非格式化 IO” 文件¶
许多科学代码都是用 FORTRAN 编写的。在 FORTRAN 中创建的最方便的文件格式之一是所谓的 "非格式化二进制文件"。这些文件具有原始二进制 IO 的所有缺点 - 没有元数据,数据取决于主机字节序、浮点表示,以及可能的大小 - 但不仅仅是原始二进制。它们被组织成“记录”,这些记录用大小信息填充。尽管如此,人们还是会不时遇到这样的文件。似乎没有预先编写的代码可用于在 numpy/scipy 中读取它们,但可以使用 numpy 的记录数组相对轻松地完成。
>>> A = N.fromfile("/tmp/tmp_i7j_a/resid2.tmp",
... N.dtype([('pad1','i4'),
... ('TOA','f8'),
... ('resid_p','f8'),
... ('resid_s','f8'),
... ('orb_p','f8'),
... ('f','f8'),
... ('wt','f8'),
... ('sig','f8'),
... ('preres_s','f8'),
... ('pad3','i8'),
... ('pad2','i4')]))
此示例旨在读取 [http://www.atnf.csiro.au/research/pulsar/tempo/ref_man_sections/output.txt 文件],该文件由 [http://www.atnf.csiro.au/research/pulsar/tempo/ TEMPO] 输出。大多数字段,从“TOA”到“preres_s”,都是文件中存在且感兴趣的字段。字段“pad3”要么是文件格式中未记录的添加,要么是某种填充(在我的测试文件中它始终为零)。FORTRAN 非格式化 I/O 添加了字段“pad1”和“pad2”。每个字段都应包含每个记录的长度(以字节为单位),因此可以推断出额外“pad3”字段的存在。此代码忽略了 t
章节作者:AMArchibald,NeilMB