web-dev-qa-db-fra.com

convertir la marque décimale

J'ai un fichier CSV avec la lecture des données que je veux lire dans Python. Je reçois des listes contenant des chaînes telles que "2,5". Maintenant, faire float("2,5") ne fonctionne pas, car il a la mauvaise marque décimale. 

Comment lire ceci dans Python en tant que 2.5?

25
Till B

float("2,5".replace(',', '.')) fera dans la plupart des cas

Si valueest un grand nombre et que . a été utilisé pour des milliers, vous pouvez:

Remplacez toutes les virgules pour les points: value.replace(",", ".")

Supprimer tout sauf le dernier point: value.replace(".", "", value.count(".") -1)

22
eumiro

Vous pouvez le faire en tenant compte des paramètres régionaux:

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

Lisez this section avant d’utiliser cette méthode.

53
Lauritz V. Thaulow

Pandas soutient cette sortie de la boîte:

df = pd.read_csv(r'data.csv', decimal=',')

Voir http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

15
maggie

en utilisant un regex sera plus fiable

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)

résultat

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 )

Si vous souhaitez traiter des cas plus complexes (nombres sans chiffres avant la marque décimale, par exemple), la regex que j'ai conçue pour détecter tous les types de nombres dans le fil suivant peut vous intéresser:

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

6
eyquem

Essayez de remplacer toutes les virgules décimales par des points décimaux:

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

Bien entendu, la fonction replace fonctionne sur n’importe quelle sous-chaîne, car python fait désormais la différence entre char et string.

3
penelope

D'abord vous devez vous assurer que les paramètres régionaux ont été utilisés pour fournir le numéro . Si vous ne le faites pas, il y aura sûrement des problèmes aléatoires.

import locale

loc = locale.getlocale()  # get and save current locale
# use locale that provided the number;
# example if German locale was used:
locale.setlocale(locale.LC_ALL, 'de_DE')
pythonnumber = locale.atof(value)
locale.setlocale(locale.LC_ALL, loc)  # restore saved locale
0
ilias iliadis