分配值时的KeyError

时间:2014-09-30 18:30:46

标签: python excel python-2.7 csv

我正在尝试将.csv数据提供给python。

这就是我的代码:

import csv

revenue = {}

prices = []
for i in range(1,21):
    prices.append(i)
prices = tuple(prices) #convert to tuple to make immutable and faster   

with open("test.csv") as file_handle:
    file_reader = csv.reader(file_handle)
    file_handle.readline()
    file_handle.readline()  #skip first 2 lines due to column header titles
    for row in file_reader:
        revenue[prices] = row[1] #assign revenue at each price-point

print revenue

print revenue[10]

这就是.csv数据的样子或我的输入。

0.01    1397371
0.02    1350610
0.03    1306431
0.04    1136959
0.05    1106950
0.06    1064727
0.07    1037497
0.08    1030768
0.09    976552
0.1     963091
0.11    949641
0.12    917551
0.13    884734
0.14    878675
0.15    775261
0.16    765643
0.17    756057
0.18    733458
0.19    723077
0.2     654178

第一列是价格,第二列是收入。因为我选择的价格总是一样的,所以我实际上忽略了数据,只是创建了一个整数形式的价格表,我将其转换为元组(因为我读到如果数据是不可变的,则元组将更快地处理)

问题:如果我打印收入[10]我想看963091.相反我得到KeyError:20。

当我打印收入时,我预计会打印所有价格和相关收入,而是打印整个价目表,然后是列表中最后一个价格的最终收入值(0.2),654178。 / p>

我是python的新手,所以我为新手问题道歉,我一直在阅读并试图解决这个问题,我仍在苦苦挣扎 - 对我的方法的任何建议也受到欢迎,我可以使用所有的帮助我可以得到。

提前致谢!

3 个答案:

答案 0 :(得分:1)

revenue[prices] = row[1]没有插入row的值(这是一个单项列表),而是使用元组本身。

>>> revenue[prices] = ''
>>> revenue
{(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20): ''}

with open("test.csv") as file_handle:
    file_reader = csv.reader(file_handle)
    file_handle.readline()
    file_handle.readline()  #skip first 2 lines due to column header titles
    for row in file_reader:
        revenue[int(float(row[0].split()[0]) * 100)] = row[0].split()[1] #assign revenue at each price-point

要将行转换为价格和收入,请将第一项(唯一)转换为价格和收入,然后将小数转换为int。

答案 1 :(得分:0)

这是因为收入被声明为字典。无论何时访问字典中的元素,您都应该使用密钥而不是数字。 因此在这种情况下收入[price [10]]。请注意,元组从0开始到n。 因此,价格[10]实际上将是第11个元素

你也在传递收入[price] = row [1] 将整行转为收入价格。

答案 2 :(得分:0)

当您尝试通过不存在的键获取某些值时,将引发

KeyError 。在您的情况下,在for循环中构建收入字典时,您可以使用相同的键分配每个新收入,即价格元组。

revenue[prices] = row[1]

然后,您尝试通过不存在的密钥获取值。 要解决这个问题,您需要将收入分配给for循环中相应的价格元组元素。

i = 0
for row in file_reader:
    revenue[prices[i]] = row[1] #assign revenue at each price-point
    i += 1

但要确保元组的长度不小于文件中的记录数!

此外,构建价格元组的方法较短:

prices = tuple(range(1,21))