我有固定字段格式的字母數字數據的文本文件,但格式因行而異,所以我無法做到一個固定的字段讀取。 我正在逐行閱讀,識別記錄類型,並根據該記錄類型的格式進行切片。這裏有一個$ Comments和三條數據記錄分成兩行的例子。 (順便說一句,由於這是一種可以追溯到舊的「IBM打卡」或「Hollerith」卡的格式,這些卡被限制在80列,而最後的8列保留用於序列號以防萬一你把你的卡,你把它們放在一個卡片分類機:-)如何轉換爲浮點數字的字符串表示形式,沒有「e」
MOMENT* 3 15 0 1.00297+9
* .123092 -.984732 -.123092
$ Nodal Forces of Load Set : Force
FORCE* 1 15 0 1.00297+9
* .123092 -.984732 -.123092
MOMENT* 3 15 0 1.00297+9
* .123092 -.984732 -.123092
這裏就是我遇到麻煩: 的Python似乎有麻煩的轉換格式指數。 第二的最後一個字段考慮到最後一行:
In [50]: Card1
Out[50]: 'MOMENT* 3 15 0 1.00297+9'
切片,去年我場得到:
Card1[54:]
Out[49]: ' 1.00297+9'
如果我再剝去白色空間和字符串轉換爲浮動,我得到一個「float()」的無效文字。
float(str.strip(Card1[54:]))
Traceback (most recent call last):
File "<ipython-input-52-64ddef289a29>", line 1, in <module>
float(str.strip(Card1[54:]))
ValueError: invalid literal for float(): 1.00297+9
顯然,我們知道如何解釋「1.00297 + 9」,但是Python似乎需要一個「E」或「E」認識到這是科學記數法:
float(str.strip(Card1[54:]).replace("+","E"))
Out[53]: 1002970000.0
我的問題在於負數的負指數。很顯然,通過將「-123.45-3」轉換爲「E123.45E3」,replace()會打破負指數的負數。
理想情況下,會有一些簡單的方法告訴Python僅使用+或 - 在數字的末尾來識別指數。
我唯一能想到的就是將字符串拼接成部分,如下所示。雖然這有效,但它不是優雅的...必須有更好的方法。
In[56]: String="-1.6486-5"
In[57]: float(String[0:1]+String[1:].replace("-","E-"))
Out[57]: -1.6486e-05
爲什麼將非標準浮點文字轉換爲float()能夠解析的文字並不優雅?有時候惱人的技術問題需要煩人的解決方案。你看起來很好。 –
是的,「討厭」是一個正確的表達!我沒有意識到,省略「E」是非標準的。我已經看到這麼長時間了,它對我來說只是「正常」,但我會接受它是非標準的。在這種情況下,我的解決方案可能會達到它的效果。 謝謝! 我在1977年學習了FORTRAN,我對Python的優雅印象非常深刻。我對Python相當陌生,並且確信自己必須有更好的方式......也許不是。 –
在Python中,通常*是一種更優雅的方式,但這種特殊情況似乎很難處理。正則表達式是原則性的方式,但在這種情況下是邊界矯枉過正。 –