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.