2014-09-30 2 views
0

.csv 데이터를 파이썬으로 보내려고합니다.값을 할당 할 때 KeyError가 발생했습니다.

이 내 코드는 모습입니다 :

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

내가 수익을 인쇄 할 때, 나는 모든 가격과 관련된 수익 대신, 인쇄 할 것으로 예상, I (0.2), 654178의 마지막 가격에 대한 최종 수익 값이 표시됩니다.

나는 신참자의 질문에 사과를하기에 새로운데, 나는 읽고 노력하고 있습니다. 이것을 파악하고 여전히 고민 중입니다. 내 접근 방식에 대한 조언도 환영 받고, 내가 얻을 수있는 모든 도움을 사용할 수 있습니다.

미리 감사드립니다.

+0

'revenue'가 사전이며,이 값이 10 당신이 찾고있는 것을 기반으로하는 키를 포함하지 않습니다

또한, 가격을 튜플을 구성하는 짧은 방법이 'revenue = []'을 사용하고 나중에'revenue.append (row [1])'을 사용하면된다. – linuxfan

+0

'10 '을 사용할 때'Keyerror'는 어떻게'20'이 될 수 있는가? –

+0

에서 실제 추적을 추가하십시오. 전체'prices' 튜플을 키로 사용하고 있습니다. 그것은 당신의 사전에있는 단지 하나의 열쇠입니다. –

답변

0

revenue[prices] = row[1]은 행 (단일 항목 목록)의 값을 삽입하지 않고 대신 튜플 자체를 사용합니다.


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 

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

은 가격과 수익에 행을 변환 할 첫 번째 항목을 (유일한) 촬영하려면 가격과 수익으로 분할하고, int로 소수점 가격을 변환합니다.

+0

답장을 보내 주셔서 감사합니다. Celeo, 각 키와 가격을 연결하는 방법에 대한 제안이 있습니까?이 경우 가격은 무엇입니까? – ploo

+0

나는 나의 대답을 더 많은 정보로 편집했다. – Celeo

+0

도움 주셔서 감사합니다! – ploo

0

수입이 사전으로 선언 되었기 때문입니다. 사전의 요소에 액세스 할 때 숫자가 아닌 키를 사용해야합니다. 따라서이 경우 수익 [가격 [10]]입니다. 튜플이 0에서 n으로 시작한다는 것을 기억하십시오. 따라서 가격 [10]은 실제로 11 번째 요소가됩니다

수익 [가격] = 행 [1] 은 전체 행을 수익 가격에 전달합니다.

+0

입력을 반복하고 있기 때문에 수익 [가격] = 행을 사용하기 때문에 각 수익 금액을 관련 가격에 순서대로 연관시킬 것입니다 (값이있는 것과 동일한 양의 키가 있기 때문에) – ploo

+0

[1] for 루프 내에서 row [1]에있는 모든 요소를 ​​키 가격이있는 사전 요소에 할당합니다. 또한 올바른 날 만약 내가 틀렸어도 csv 파일의 값을 쉼표로 구분해서는 안됩니다. – acquayefrank

0

존재하지 않는 키로 값을 가져 오려고하면 KeyError이 발생합니다. 귀하의 경우에 수익 for for 루프를 구성 할 때 각각의 새 수익을 가격 튜플과 동일한 키로 할당하십시오.

revenue[prices] = row[1] 

그런 다음 존재하지 않는 키로 값을 가져 오려고합니다. 이 문제를 해결하려면 for 루프에서 price 튜플의 해당 요소에 수익을 할당하려고합니다.

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)) 
관련 문제