преобразовать десятичную метку - PullRequest
26 голосов
/ 18 августа 2011

У меня есть CSV-файл с чтением данных, который я хочу прочитать в Python.Я получаю списки, которые содержат строки, такие как "2,5".Теперь выполнение float("2,5") не работает, потому что имеет неправильную десятичную метку.

Как мне прочитать это в Python как 2.5?

Ответы [ 6 ]

55 голосов
/ 18 августа 2011

Вы можете сделать это с учетом языка:

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

Прочитайте этот раздел перед использованием этого метода.

22 голосов
/ 18 августа 2011

float("2,5".replace(',', '.')) будет делать в большинстве случаев

Если value - большое число и . использовалось для тысяч, вы можете:

Заменить все запятые для точек:value.replace(",", ".")

Удалить все, кроме последней точки: value.replace(".", "", value.count(".") -1)

16 голосов
/ 16 декабря 2015

Панд поддерживает это из коробки:

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

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

6 голосов
/ 18 августа 2011

с использованием регулярных выражений будет более надежным

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 / регулярное выражение для совпадения чисел с-Без-запятых-и-десятичные-в-текст / 5929469

3 голосов
/ 23 декабря 2018

Сначала Вы должны убедиться, какой язык использовался для предоставления номера .Несоблюдение этого правила может привести к случайным проблемам.

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
3 голосов
/ 18 августа 2011

Попробуйте заменить все десятичные запятые на десятичные точки:

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

Функция replace, конечно, работает с любой подстрокой, поскольку python теперь различает char и string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...