【问题标题】:Read FORTRAN formatted numbers with Python使用 Python 读取 FORTRAN 格式的数字
【发布时间】:2012-10-27 18:22:24
【问题描述】:

我必须读取一个数据文件,其中包含以(非常)旧的 FORTRAN 样式格式化的数字。文件中的一行如下所示:

 4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3

文件(或其中的大部分)以固定宽度格式包含这些数字。在 Python 中读取这些数字的问题在于,这些数字中没有 E。看看会发生什么:

>>> float('4.50000+1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 4.50000+1

我可以编写一个解析器来读取这个,但想知道这是否已经完成。这是一种旧的 FORTRAN 格式,所以我想也许有人已经弄清楚了。有人知道图书馆可以读取这样的数字吗?

【问题讨论】:

  • 最简单的可能是在+- 之前插入E,Python 将在结果字符串处插入。 (假设这就是它的实际含义)。
  • 从未见过这样的 Fortran 输出

标签: python fortran


【解决方案1】:

您可以使用Fortran Format Library for Python,如下所示,

>>> import fortranformat as ff
>>> reader = ff.FortranRecordReader('(6F13.7)')
>>> reader.read(' 4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3')
[45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]

这个库已经针对英特尔的 ifort 9.1 编译器进行了广泛测试,以完全匹配一些奇怪的 FORTRAN 文本 IO。

使用安装

pip install fortranformat

我应该声明一个偏见,因为我写了这个库......

【讨论】:

【解决方案2】:

您可以使用正则表达式在将数字传递给float 之前插入“E”。

re.sub(r'(\d)([-+])', r'\1E\2', number)

【讨论】:

    【解决方案3】:

    这应该可行:

    In [47]: strs="4.500000+1 1.894719-3 4.600000+1 8.196721-3 4.700000+1 2.869539-3"
    
    In [48]: [float(x.replace("+","e+").replace("-","e-")) for x in strs.split()]
    
    Out[48]: [45.0, 0.001894719, 46.0, 0.008196721, 47.0, 0.002869539]
    

    【讨论】:

    • 这就是我要做的,但想知道是否有人已经做过这样的事情。显然,图书馆需要更多功能才能获得完整的图书馆,但这只是最低限度。
    • 这个功能看起来不错。这需要稍作修改,因为我所有的数字都是这样格式化的,而不仅仅是小数字。
    • 负数呢? -4.5000+1
    • 最好看看你是否有否定以及它们是如何格式化的——假设一个固定的字段宽度,它们可能会进入下一个没有空格的数字。
    【解决方案4】:

    另一种方法是使用系统命令访问 AWK:

    注意 COMMAND 中的 " 字符的转义

    import subprocess
    COMMAND = "awk 'gsub(/D/,\"E\");{print}' epsc8.out > epsc8E.out"
    subprocess.call(COMMAND, shell=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-14
      • 2014-06-12
      • 2012-09-03
      • 2013-08-13
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      相关资源
      最近更新 更多