2017-12-24 3 views
0

Ich lese zwei csv-Dateien und drucke spezifische Spalte nach Schlüsselname. Zuerst habe ich eine Liste meiner Schlüsselnamen wie key = [a,b,c]Python: Warum Whiscode nur Schleife einmal?

und ich diesen Code ein:

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 

zwei CSV-Dateien:

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

Ergebnis meiner erwartet wird, wird es Schleife dreimal weil es drei Elemente gibt in key list.exected Ergebnis sollte wie folgt aussehen:

111 1111 
222 2222 
333 3333 

Aber tatsächliche Ergebnis ist:

111 1111 

es nur Schleife einmal. Ich bin neu im Codieren von Dingen, brauche Hilfe! Vielen Dank!!

Antwort

1

Leser sind einmalige Iteratoren und sind nach einer Iteration erschöpft.

Das bedeutet, dass Sie in der zweiten Zeit nichts in reader3 haben, da Sie es bereits aufgebraucht haben.

Versuchen Sie folgendes:

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

Wenn Sie mit großen Dateien anspruchsvollere Matching verwenden oder einfach nur wieder zu öffnen, die jedes Mal Datei.

+1

Danke! Es klappt! – shuoqi

0

Denken Sie an einen CVSReader als einen einmaligen Iterator über die Datei. Sobald Sie eine Zeile gelesen haben, können Sie nicht mehr zurückgehen, und wenn der Leser erschöpft ist, können Sie keine weiteren Daten aus der Datei lesen, ohne sie neu zu erstellen. Eine gute Übung wäre, beide Leser im Gedächtnis zu lesen und dann darüber zu gehen. Zum Beispiel:

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

das funktioniert auch! und wirklich gute Erklärung. Vielen Dank – shuoqi

Verwandte Themen