2017-12-24 22 views
0

私は2つのcsvファイルを読んで、特定の列をキー名で印刷する傾向があります。python:なぜwhisコードは1回だけループするのですか?

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 

2 CSVファイル: まず、私はkey = [a,b,c]

とIこれらの次のコードのように私のキー名のリストを持っている

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

私の期待される結果は、それがループ3倍key list.expected resultには3つの要素があるため、次のようになります。

111 1111 
222 2222 
333 3333 

しかし、実際の結果は次のとおりです。

111 1111 

それだけでループ1時間。私は物事をコーディングする上で新しいです、いくつかの助けが必要です!ありがとう!!

答えて

1

リーダーは1回限りのイテレーターであり、1回の反復後に消耗します。

これは、あなたが既に使い果たされているため、2度目の周りにはreader3に何もないことを意味します。あなたは大きなファイルを使用している場合はその都度、より洗練されたマッチングや、単に再オープンしたファイルを使用し

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

はこれを試してみてください。

+1

ありがとうございます!できます! – shuoqi

0

CVSReaderをファイルに対して1回限りの反復子と考えてください。一度読んだ行は元に戻れず、もう一人は使い果たされてしまいます。ファイルを再作成せずにファイルからデータを読み取ることはできません。良い習慣は、両方の読者をメモリに読み込んで、それを越えることです。例:

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

これも動作します!本当に良い説明です。ありがとう – shuoqi

関連する問題