2011-08-18 9 views
15

Ho un file CSV con lettura dei dati che voglio leggere in Python. Ottengo liste contenenti stringhe come "2,5". Ora, fare float("2,5") non funziona, perché ha il segno decimale sbagliato.convertire il segno decimale

Come si legge questo in Python come 2.5?

+0

avete controllato: http://pypi.python.org/pypi/Babel/0.9.6 – mouad

risposta

16

float("2,5".replace(',', '.')) farà nella maggior parte dei casi

Se value è un gran numero e . è stato utilizzato per migliaia di persone, è possibile:

Sostituire tutte le virgole per i punti: value.replace(",", ".")

Rimuovere tutti, ma il ultimo punto: value.replace(".", "", value.count(".") -1)

+14

Solo per curiosità, è è la soluzione a modo vero? Sembra orribile per me. – agibalov

+0

@ loki2302 - Il delimitatore decimale standard è un punto. Se si utilizza qualsiasi altra cosa (cioè virgola o qualcosa di più "esotici" come lo spazio, una lettera o qualsiasi altra cosa), allora si deve sostituire per renderlo 'galleggiante()' capisco cosa vuoi dire. – eumiro

+0

Il separatore decimale è un problema [localizzazione] (http://en.wikipedia.org/wiki/Decimal_point#Hindu-Arabic_numeral_system), quindi credo @ meraviglie loki2302 se c'è un modo per informare Python per _adhere_ al modo localizzato di rappresentare un numero in virgola mobile durante l'analisi. –

2

Prova a sostituire tutte le virgole decimali con punti decimali:

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

La funzione replace, ovviamente, funziona su qualsiasi sottostringa poiché Python ora distingue tra char e stringa.

+10

'str' è un nome di variabile non valido. – eumiro

+0

hai ragione, ho appena copiato il codice da qualche pagina tutorial e aggiunto l'ultima riga ... – penelope

3

utilizzando un'espressione regolare sarà più affidabile

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) 

risultato

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) 

Se si desidera trattare i casi più complessi (i numeri senza cifre prima del punto decimale per exemple) l'espressione regolare I artigianale per rilevare tutti i tipi di numeri nella seguente discussione può essere di tuo interesse:

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

+0

Come puoi farlo su un dataframe panda (non stringa)? – hhh

46

E 'possibile farlo nel modo locale-aware:

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") 

Leggi this sezione prima di usare questo metodo.

+1

Si dovrebbe anche tenere presente che questo non sarà infallibile: http://stackoverflow.com/questions/2186327/thread-safe-locale-techniques –