Python:ValueError:float()的无效文字

时间:2017-05-19 20:22:14

标签: python python-2.7

我要创建一个从csv转换的excel文件中导入数据的字典,我想将字典的字符串值转换为float,但是我得到了这个错误ValueError: invalid literal for float(): 437,33

import csv
from collections import defaultdict

my_dict = {}
my_dict = defaultdict(lambda : 0, my_dict)

with open('excel_csv_file.csv', 'rb') as file_object:
    reader = csv.reader(file_object, delimiter=';')
    for x in reader:
        my_dict[(x[0], x[1])] = x[2]

my_dict = dict((k, float(v)) for k,v in my_dict.iteritems())
print my_dict

这就是my_dict的样子

{('11605', 'TV'): '437,33',
 ('10850', 'SMARTPHONE'): '163,47',
 ('11380', 'TV'): '1911,72',
 ('11177', 'SMARTPHONE'): '255,80',
 ('11237', 'TABLET'): '382,28',
 ('11238', 'TABLET'): '458,01',
 ('11325', 'TABLET'): '309,55',
 ...}

为什么我收到此错误?

另外,有没有办法将元组键中的字符串值转换为int? (例如('11605', 'TV')(11605, 'TV'))?

4 个答案:

答案 0 :(得分:1)

>>> float('382,28')
ValueError: invalid literal for float(): 382,28

因为Python期望.用于分隔数字的整数和小数部分。你能做的最简单的事就是替换它:

>>> float('382,28'.replace(",", "."))
382.28

-

my_dict = dict((k, float(v.replace(",", "."))) for k, v in my_dict.iteritems())

答案 1 :(得分:1)

对于第一个错误,您必须将看起来像"22,32"的浮动字符串数据更改为"22.32",替换,的{​​{1}}。  对于第二个问题,如果你想从字符串中获取一个int,那么只需要执行int(" 43")。

答案 2 :(得分:1)

Python使用LstOfItems.Where(p => p.LstOfSubItems.All(ls=> ls != null)) (句点)来分隔浮点数的整数和小数部分,但您的数据使用.(逗号)。

要转换为,,您可以使用值解包:

int

由于您使用的是Python 2.7,因此您还可以使用line my_dict = dict(((int(k1), k2), float(v.replace(',', '.'))) for (k1,k2),v in my_dict.iteritems()) 理解来简化这一过程:

dict

<强>加成:

如果您有来自美国以外国家/地区的输入,并且您希望可能遇到类似于小数分隔的其他问题,则可以使用line my_dict = {(int(k1), k2): float(v.replace(',', '.')) for (k1,k2),v in my_dict.iteritems()} 模块。如果您使用

启动脚本
locale

您可以使用区域设置模块import locale locale.setlocale(locale.LC_ALL, '') )中的各种功能,而不是像locale.atof这样的内置转换方法,它会自动处理用户的区域设置。

答案 3 :(得分:0)

Daniel H已在his Bonus answer中说过,但简而言之,我会提出以下指示:

将语言环境设置为西班牙语,并使用locale.atof代替float

在代码中它将是:

import locale
locale.setlocale(locale.LC_NUMERIC,"es_ES")
locale.atof("123,45")

在您的情况下,请使用

my_dict = dict((k, locale.atof(v)) for k,v in my_dict.iteritems())

而不是

my_dict = dict((k, float(v)) for k,v in my_dict.iteritems())