2015-01-18 2 views
0

이 도우미 함수 (StackOverflow에서 찾은)를 사용하여 CSV 파일의 행을 읽지 만 특정 열만 유지하는 데 도움이됩니다. 원본 파일. Python : csv 파일의 특정 열을 읽으려고하면 Python : row_type() 오류가 발생합니다.

def read_csv(file, columns, type_name="Row"): 
    try: 
     row_type = namedtuple(type_name, columns) 
    except ValueError: 
     row_type = tuple 
    rows = iter(csv.reader(file)) 
    header = rows.next() 
    mapping = [header.index(x) for x in columns] 
    for row in rows: 
     row = row_type(*[row[i] for i in mapping]) 
     yield row 

는 지금은이 기능을 사용하여 작성한 코드는 키를 사용하여, 두 개의 범주, x와 y의 questions.csv에 두 개의 파일, 키 파일과 응답 파일 및 등급 응답이 열립니다 answers.csv 파일에 있습니다.

x = ["q1","q4","q5","q7","q9"] 
y = ["q2","q3","q6","q8","q10"] 

key = open('answers.csv','rU') 
for row in read_csv(key, x): 
    x_answers = row 
    print x_answers 
key.close() 

key = open('answers.csv','rU') 
for row in read_csv(key, y): 
    y_answers = row 
    print y_answers 
key.close() 

responses = open('questions.csv', 'rU') 
for row in read_csv(responses, x): 
    print row 
responses.close() 

responses = open('questions.csv', 'rU') 
for row in read_csv(responses, y): 
    print row 
responses.close() 

지금은 그냥 두 가지 범주로 구분하여 두 파일에서 추출 된 행을 인쇄하고있어 프로그램이 오면 나는 루프 마지막에이 오류가 발생합니다 :

execfile("read_csv.py") 
Row(q1='b', q4='c', q5='c', q7='b', q9='d') 
Row(q2='d', q3='c', q6='b', q8='b', q10='b') 
Row(q1='b', q4='c', q5='c', q7='c', q9='d') 
Row(q1='b', q4='c', q5='c', q7='b', q9='d') 
Row(q1='b', q4='c', q5='c', q7='b', q9='d') 
Row(q1='b', q4='c', q5='c', q7='b', q9='d') 
Row(q1='b', q4='c', q5='c', q7='b', q9='d') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "read_csv.py", line 52, in <module> 
     for row in read_csv(responses, US): 
    File "read_csv.py", line 20, in read_csv 
     row = row_type(*[row[i] for i in mapping]) 
    IndexError: list index out of range 

I 돈 범위가 범위를 벗어난 이유는 for 루프가 이전 for 루프의 정확한 복사본이기 때문에 파일을 다시 열어 커서가 처음에 오도록했는지 이해할 수 없습니다.

답변

0

나는 len (행)과 len (매핑)을 점검하고 이들이 동일한 차원인지 확인합니다. 그렇지 않으면 인덱스 오류가 발생합니다. 그냥 생각.

관련 문제