5

(非常に)古い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形式なので、おそらく誰かがすでにそれを理解していると思いました。このような数字を読むための図書館を知っている人はいますか?

4

4 に答える 4

8

Python用のFortranフォーマットライブラリは次のように使用できます。

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

このライブラリは、Intelのifort 9.1コンパイラで広範囲にテストされており、奇妙なFORTRANテキストIOの一部と正確に一致します。

を使用してインストール

pip install fortranformat

このライブラリを書いたので、バイアスを宣言する必要があります...

于 2012-11-25T14:33:48.897 に答える
5

に番号を渡す前に、正規表現を使用して「E」を挿入できますfloat

re.sub(r'(\d)([-+])', r'\1E\2', number)
于 2012-11-07T16:40:28.087 に答える
2

これは機能するはずです:

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]
于 2012-11-07T16:42:39.633 に答える
0

別のアプローチは、システムコマンドを使用してAWKにアクセスすることです。

内部の「文字」のエスケープに注意してくださいCOMMAND

import subprocess
COMMAND = "awk 'gsub(/D/,\"E\");{print}' epsc8.out > epsc8E.out"
subprocess.call(COMMAND, shell=True)
于 2018-05-19T00:01:27.850 に答える