2017-05-24 2 views
0

Ich lese eine CSV-Datei in DICTREADER und möchte seinen Inhalt zweimal auf dem Terminal drucken. Aber es druckt nur einmal. Ist DICTREADER nach dem ersten Ausdruck LEER?Python3-Wörterbuch BLANK nach der ersten Operation

dictreader = csv.DictReader(reader) 

for k in dictreader: 
    print(k)   # Prints all keys/values 

for i in dictreader: 
    print(i)   # Doesn't print anything 

Antwort

0

Ja, wenn man sich die source für DictReader aussehen werden Sie es ein Iterator (siehe hat eine Implementierung für __next__ und __iter__ kehrt self).

Nachdem es einmal durchlaufen wurde, wird es erschöpft sein; Folge-Iterationen werden einfach nichts erzeugen. Sie können daraus eine Liste erstellen, wenn Sie sie öfter durchlaufen müssen.

0

Alle csv Wrapper umhüllen dateiähnliche Objekte. Dateiähnliche Objekte haben einen Zustand, genauer gesagt, die Suchposition (und die Pipes können überhaupt nicht suchen), so dass die Wrapper dem Objekt erlauben, die Position zu verwalten, was alles, was als nächstes kommt, analysiert.

Wenn die Iteration zweimal hintereinander ausgeführt wird, müssen die Wrapper csv den Dateiinhalt zwischenspeichern (unbegrenzte Speicherkapazitäten) oder sie zum Anfang der zugrunde liegenden Datei zurücksuchen (nicht möglich für dateiähnliches Streaming) Objekte).

Denken Sie an die csv Wrapper als semi-Datei-wie macht dies leichter zu begreifen. Sie können nicht for line in myfile: zweimal hintereinander ohne zu suchen, und in ähnlicher Weise können Sie for row in mycsv: zweimal hintereinander nicht ohne das zugrunde liegende dateiähnliche Objekt zu tun.

Angenommen, Ihre Leser ist durchsuchbar, könnte man es zweimal wiederholen (ohne unbegrenzten Speicher raubend), indem Sie:

dictreader = csv.DictReader(reader) 

for k in dictreader: 
    print(k)   # Prints all keys/values 

reader.seek(0) # Restart from beginning 

for i in dictreader: 
    print(i)   # Prints all keys/values 

Oder, wenn die Dateien klein sein, bekannt sind, könnten Sie Cache:

# Cache reusable values 
dictlines = tuple(csv.DictReader(reader)) 

for k in dictlines: 
    print(k)   # Prints all keys/values 

for i in dictlines: 
    print(i)   # Prints all keys/values 

Sie könnten auch itertools.tee für den gleichen Zweck verwenden, aber das hilft nur, wenn alle Iteratoren (etwas) im Tandem fortgeschritten sind; Wenn Sie einen vor dem Start des nächsten ausführen, ist es normalerweise schneller, einfach zwischen list oder tuple zu cachen.

Verwandte Themen