2017-12-24 20 views
0

나는 두 개의 csv 파일을 읽고 키 이름으로 특정 열을 인쇄하는 경향이있다.파이썬 : whis 코드는 한 번만 반복됩니다.

with open('./file/report.csv', 'rb') as csvfile,open('./file/all.csv','rb') as csvfile2: 
    reader2 = csv.DictReader(csvfile) 
    reader3 = csv.DictReader(csvfile2) 
    for i in key: 
     for row in reader2: 
      for row2 in reader3: 
       if row['Case Id'] == i and row2['name'] == i: 
        a=row['Status'] 
        b = row2['result'] 
        print a,b 

이 CSV 파일 : 첫째, 내가 key = [a,b,c]

나는이 다음 코드처럼 내 키 이름의 목록을 가지고

report.csv:       all.csv:   
Case Id  Status     name   result 
    a    111     a    1111 
    b    222     b    2222 
    c    333     c    3333 

내 예상 결과는 것이다 루프 세 번입니다 key list.expected result의 세 요소가 다음과 같아야합니다.

111 1111 
222 2222 
333 3333 

그러나 실제 결과는 다음과 같습니다

111 1111 

을 단지 루프를 한 번. 나는 코딩에 새로운데, 도움이 필요해! 감사!!

답변

1

판독기는 일회성 반복기이며 한 번의 반복 후에 고갈됩니다.

즉, 두 번째로 이미 쓸모가 없어서 reader3에 아무것도 표시되지 않습니다.

이 시도 :

reader2 = list(csv.DictReader(csvfile)) # optional 
reader3 = list(csv.DictReader(csvfile2)) # must 

당신이 큰 파일을보다 정교 일치를 사용하거나 다시 엽니 파일을 매번 사용하는 경우.

+1

감사합니다. 그것은 작동합니다! – shuoqi

0

CVSReader을 파일에 대해 한 번만 반복자로 생각하십시오. 일단 행을 읽으면 되돌릴 수 없으며 독자가 고갈되면 파일을 다시 만들지 않고 파일에서 더 이상의 데이터를 읽을 수 없습니다. 좋은 예는 두 독자를 모두 읽은 다음에 읽는 것입니다. 예 :

list2 = list(reader2); 
list3 = list(reader3); 

for i in key: 
    for row in list2: 
     for row2 in list3: 
      if row['Case Id'] == i and row2['name'] == i: 
       a=row['Status'] 
       b = row2['result'] 
       print a,b 
+0

이것은 또한 작동합니다! 그리고 정말로 좋은 explaination. 감사 – shuoqi