2016-12-05 4 views
1

Ich habe versucht, einige CSV-Verarbeitung mit CSV-Reader zu tun und war auf ein Problem, wo ich über die Zeilen durch den CSV-Reader lesen müssen iterieren. Bei der zweiten Iteration gibt es jedoch nil zurück, da alle Zeilen bereits iteriert wurden. Gibt es eine Möglichkeit, den Iterator zu aktualisieren, um wieder von Grund auf neu zu starten.Setzen Sie den Iterator csv.reader() zurück

Code:

desc=open("example.csv","r") 

Reader1=csv.read(desc) 

for lines in Reader1: 
(Some code) 

for lines in Reader1: 
(some code) 

was will genau unter

id, Preis, Name x, y, z a, b, c eine CSV-Datei im Format gelesen, um zu tun und ordnen sie in das Format unter ID: xa Preis: yb Name: zc ohne Pandas Bibliothek

+1

Wenn Sie als einmal darüber mehr zu durchlaufen müssen, verbrauchen sie in eine Liste - 'all_lines = list (Reader1)'. – jonrsharpe

+0

Wäre das nicht extra Platz? seit Reader1 hat bereits alle Zeilen. –

+0

@PoojaGupta Sie können 'desc.seek (0)' ausführen und dann einen neuen Iterator erstellen, um zu vermeiden, dass ein Dateideskriptor verschwendet wird und die CSV nicht im Speicher verbleibt. –

Antwort

3

zurücksetzen das zugrunde liegende Dateiobjekt mit seek, den folgenden vor der zweiten Schleife Zugabe:

desc.seek(0) 
# Apparently, csv.reader will not refresh if the file is seeked to 0, 
# so recreate it 
Reader1 = csv.reader(desc) 

Wohlgemerkt, wenn der Speicher kein Problem ist, wäre es in der Regel schneller sein, um die Eingabe in ein list zu lesen, wiederholen Sie dann die list zweimal . Alternativ könnten Sie auch use itertools.tee verwenden, um zwei Iteratoren aus dem Initialiterator zu machen (es wird ein ähnlicher Speicher benötigt wie list), wenn Sie einen Iterator vollständig durchlaufen, bevor Sie den anderen Iterator starten, anstatt sofort auf die gesamte Datei zu warten lesen Sie bevor Sie etwas davon verarbeiten können). Bei beiden Vorgehensweisen werden zusätzliche Systemaufrufe vermieden, die die Datei zweimal durchlaufen würde. Der tee Ansatz, nach der Zeile erstellen Sie Reader1 auf:

# It's not safe to reuse the argument to tee, so we replace it with one of 
# the results of tee 
Reader1, Reader2 = itertools.tee(Reader1) 

for line in Reader1: 
    ... 

for line in Reader2: 
    ... 
+0

Dies scheint den Iterator jedoch nicht automatisch zurückzusetzen. –

+1

@musically_ut: Ah. Dumme Implementierungsdetails. Einfach, es einfach neu zu erstellen. Bearbeitet. – ShadowRanger

Verwandte Themen