2012-11-07 80 views
4

我必須讀取一個數據文件,其中包含使用(非常)舊FORTRAN樣式格式化的數字。文件的一行如下所示:用Python讀取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格式,所以我想也許有人已經弄明白了。有沒有人知道圖書館讀取這樣的數字?

+0

最簡單的可能是之前的'+'或'插入一個'E' -'和Python在結果字符串中。 (假設這就是它的實際含義)。 –

+1

從來沒有見過像這樣的Fortran輸出 – agentp

回答

1

這應該工作:

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

這就是我想要做的,但想知道是否有人已經做了這樣的事情。顯然,需要有更多的圖書館功能才能獲得完整的圖書館,但這只是最低限度。 – jlconlin

+1

@Jeremy檢查了這一點[一個python函數將FORTRAN格式化的浮動字符串轉換爲浮動](https://gist.github.com/897137) –

+0

該函數看起來不錯。這需要稍作修改,因爲我所有的號碼都是這樣格式化的,而不僅僅是小號。 – jlconlin

5

您可以使用正則表達式在將數字傳遞給float之前插入「E」。

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

您可以使用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] 

這個庫已經aginst英特爾ifort 9.1編譯器進行了廣泛測試,以精確匹配一些weirder FORTRAN textual IO。

安裝使用

pip install fortranformat 

我要宣佈一個偏見,因爲我寫了這個庫...