【发布时间】:2011-10-29 16:52:15
【问题描述】:
我有一个 CSV 文件,其中包含我想读入 Python 的数据读取。我得到包含"2,5" 之类的字符串的列表。现在做float("2,5") 不起作用,因为它有错误的小数点。
如何将其作为2.5 读入Python?
【问题讨论】:
标签: python locale decimal-point
我有一个 CSV 文件,其中包含我想读入 Python 的数据读取。我得到包含"2,5" 之类的字符串的列表。现在做float("2,5") 不起作用,因为它有错误的小数点。
如何将其作为2.5 读入Python?
【问题讨论】:
标签: python locale decimal-point
如果将点用作千位分隔符,则要交换逗号和点,您可以使用第三个符号作为临时占位符,如下所示:
value.replace('.', '#').replace(',', '.').replace('#', ',')
但是看到你想从字符串转换为浮点数,你可以删除任何点,然后用点替换任何逗号
float(value.replace('.', '').replace(',', '.'))
IMO 这是最易读的解决方案
【讨论】:
首先您必须确保用于提供号码的区域设置。不这样做肯定会出现随机问题。
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
【讨论】:
float("2,5".replace(',', '.')) 在大多数情况下都可以
如果value是一个很大的数字,而.已经用了几千,你可以:
将所有逗号替换为点:value.replace(",", ".")
删除除最后一点之外的所有内容:value.replace(".", "", value.count(".") -1)
【讨论】:
; as field delimiter 的国家/地区的标准 csv 格式。
Pandas 支持这个开箱即用:
df = pd.read_csv(r'data.csv', decimal=',')
见http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
【讨论】:
您可以通过区域感知方式进行操作:
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 部分。
【讨论】:
尝试用小数点替换所有小数点:
floatAsStr = "2,5"
floatAsStr = floatAsStr.replace(",", ".");
myFloat = float(floatAsStr)
当然,函数replace 可以处理任何子字符串,因为python 现在可以区分字符和字符串。
【讨论】:
str 是一个糟糕的变量名。
floatAsStr 也好不到哪里去。 :-P
使用正则表达式会更可靠
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 )
如果您想处理更复杂的情况(例如小数点前没有数字的数字),我为检测以下线程中所有类型的数字而精心设计的正则表达式可能会让您感兴趣:
【讨论】: