我要创建一个从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')
)?
答案 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)
将语言环境设置为西班牙语,并使用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())