2011-08-18 60 views
15

我有一個CSV文件,裏面有我想要讀入Python的數據。我得到包含字符串的列表,如"2,5"。現在做float("2,5")不起作用,因爲它有錯誤的小數點。轉換成小數點

如何將此內容讀入Python中作爲2.5

+0

你檢查:http://pypi.python.org/pypi/Babel/0.9.6 – mouad

回答

16

float("2,5".replace(',', '.'))在大多數情況下

辦?如果value是大量的和.已用於千,您可以:

更換所有逗號爲兩點:value.replace(",", ".")

全部刪除,但最後一點:value.replace(".", "", value.count(".") -1)

+14

只是好奇,是它是真正的解決方案嗎?看起來很糟糕。 – agibalov

+0

@ loki2302 - 標準的小數點分隔符是一個點。如果您使用其他任何東西(例如逗號或更像空間,字母或其他任何東西),那麼您必須替換它以使'float()'理解您的意思。 – eumiro

+0

小數分隔符是一個[本地化](http://en.wikipedia.org/wiki/Decimal_point#Hindu-Arabic_numeral_system)問題,所以我猜@ loki2302想知道是否有方法通知Python到_adhere_到本地化的方式代表解析時的浮點數。 –

2

嘗試用小數點代替所有小數點的逗號:

floatAsStr = "2,5" 
floatAsStr = floatAsStr.replace(",", "."); 
myFloat = float(floatAsStr) 

函數replace當然可以用於任何子字符串,因爲python現在可以區分char和string。

+10

'str'是一個糟糕的變量名稱。 – eumiro

+0

你是對的,我剛剛複製了一些教程頁面的代碼,並添加了最後一行... – penelope

3

使用正則表達式會更可靠

import re 

decmark_reg = re.compile('(?<=\d),(?=\d)') 

ss = 'abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3)' 

print ss 
print decmark_reg.sub('.',ss) 

結果

abc , 2,5 def ,5,88 or (2,5, 8,12, 8945,3) 
abc , 2.5 def ,5.88 or (2.5, 8.12, 8945.3) 

如果你想(有小數大關爲例之前沒有位數)治療更復雜的情況下,我製作的正則表達式檢測以下線程中的所有類型的數字可能會對您感興趣:

stackoverflow.com/questions/5917082/regular-expression-to-match-numbers-with-or-without-commas-and-decimals-in-text/5929469

+0

如何在熊貓數據框(而不是字符串)上做到這一點? – hhh

46

你可以做到這一點的語言環境感知方式:

import locale 

# Set to users preferred locale: 
locale.setlocale(locale.LC_ALL, '') 
# Or a specific locale: 
locale.setlocale(locale.LC_NUMERIC, "en_DK.UTF-8") 

print locale.atof("3,14") 

閱讀this使用此方法前一節。

+1

還應該記住,這不會是線程安全的:http://stackoverflow.com/questions/2186327/thread-safe-locale-techniques –