2017-03-06 30 views
0

我有固定字段格式的字母數字數據的文本文件,但格式因行而異,所以我無法做到一個固定的字段讀取。 我正在逐行閱讀,識別記錄類型,並根據該記錄類型的格式進行切片。這裏有一個$ 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 
+0

爲什麼將非標準浮點文字轉換爲float()能夠解析的文字並不優雅?有時候惱人的技術問題需要煩人的解決方案。你看起來很好。 –

+0

是的,「討厭」是一個正確的表達!我沒有意識到,省略「E」是非標準的。我已經看到這麼長時間了,它對我來說只是「正常」,但我會接受它是非標準的。在這種情況下,我的解決方案可能會達到它的效果。 謝謝! 我在1977年學習了FORTRAN,我對Python的優雅印象非常深刻。我對Python相當陌生,並且確信自己必須有更好的方式......也許不是。 –

+0

在Python中,通常*是一種更優雅的方式,但這種特殊情況似乎很難處理。正則表達式是原則性的方式,但在這種情況下是邊界矯枉過正。 –

回答

1

我建議使用一個正則表達式替換 https://docs.python.org/2/library/re.html#re.sub 和匹配作爲EITHER +/- 例如(開始)(0+位數)(正好爲1位)(+或 - )(1個+位數) 或試圖2個替換一前一後用+和 - 分別

0

鑑於這是非標準符號對於指數,我不希望任何事情比我想出了更好的:(更改替換了「e」,因爲這就是Python的回報。)

In[56]: String="-1.6486-5" 
In[57]: float(String[0:1]+String[1:].replace("-","e-")) 
Out[57]: -1.6486e-05 

感謝所有誰評論!

相關問題