Problem: mehrfaches Iterieren über DictReader

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Darkelf
User
Beiträge: 7
Registriert: Mittwoch 5. März 2008, 19:04

Mittwoch 5. März 2008, 19:35

Hallo zusammen,

ich habe ein kleines Problem mit DictReader.
Ich würde gerne wissen, ob es möglich ist, über eine Instanz von DictReader mehr als einmal zu iterieren.

Beispiel:
Über ein Dictionary kann ich ja so oft iterieren, wie ich lustig bin.

Code: Alles auswählen

dic = {10:10, 11:11, 12:12}
for key in dic:
    print key

>>10
>>11
>>12
Das funzt auch noch, wenn ich die for-Schleife x-mal ausführe.
Versuche ich ähnliches mit einem DictReader ist nach dem ersten Durchlauf Schluß.

Code: Alles auswählen

reader = csv.DictReader(open("dictest.csv"), delimiter=";")
for row in reader:
    print row

>>(der Output)
Rufe ich diese for-Schleife nochmal auf, bleibt row leer.
Ich weiß, dass man das Dictionary nicht direkt mit dem DictReader vergleichen kann, da der DictReader ja eine Anzahl von Dictionaries ausspuckt und ich folglich nicht direkt über ein Dictionary iteriere.
Dennoch kann ich mir kaum vorstellen, dass das bei einem DictReader nur einmal gehen soll. Gibt es irgendeine Möglichkeit, quasi zum Anfang zurückzuspulen? Sowas wie reader.reset()???

Vielen Dank für euere Hilfe.

Ein grübelnder
Darkelf
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 5. März 2008, 19:49

Darkelf hat geschrieben:Gibt es irgendeine Möglichkeit, quasi zum Anfang zurückzuspulen?
Hallo Darkelf!

Willkommen im Python-Forum!

Nein. Du kannst nicht zurück spulen. Du kannst allerdings den Datenzeiger der Textdatei wieder auf 0 setzen. Aber da in deinem Beispiel die Datei nicht an eine Variable gebunden wird, kannst du auch nicht direkt auf die Datei zugreifen um den Zeiger wieder auf 0 zu setzen.

ungetestet:

Code: Alles auswählen

csv_file = file("dictest.csv", "rb")
try:
    reader = csv.DictReader(csv_file, delimiter = ";")
    for row in reader:
        print row
    csv_file.seek(0)
    reader = csv.DictReader(csv_file, delimiter = ";")
    for row in reader:
        print row
finally:
    csv_file.close()
mfg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 5. März 2008, 20:36

Das Modul "itertools" bietet dafür auch die schöne Funktion "tee".
Darkelf
User
Beiträge: 7
Registriert: Mittwoch 5. März 2008, 19:04

Mittwoch 5. März 2008, 20:36

Hallo gerold,

vielen Dank für die nette Begrüßung und die schnelle Antwort.
Leider ist das so für mich nicht praktikabel, da ich ansonsten in einer verschachtelten Schleife ca. 170 mal einen DictReader instanziieren müsste.
Ich habe eine Liste mit eben ca. 170 Werten und muss die .csv durchlaufen um die Werte , die zu diesen Listenelementen gehören, zu ermitteln.

Das ganze sieht in etwa so aus:

Code: Alles auswählen

for item in firstlist:
    for row in reader:
        if row["value"] == item:
            pass
Da wo jetzt "pass" steht, ist im Code natürlich was anderes, aber das Prinzip bleibt. Ich kann nicht knapp 200x den DictReader bemühen.
Wenn es keine Möglichkeit gibt zurückzuspulen, dann muss ich mir was anderes überlegen. row enthält ja bei jedem Iterationsschritt ein Dictionary. Ich glaube ich werde mal versuchen, diese Dicts in eine Liste zu pferchen - über diese Liste kann ich ja dann wieder bis zum Sankt-Nimmerleinstag hinweg hoppeln 8) .
Ich versuchs mal.

Vielen Dank
Darkelf

edit: Sorry, EyDu habe deinen Reply erst gesehen, nachdem ich schon mit Schreiben fertig war. Was bitte ist denn "tee" (außer dem Getränk :wink: ). Hört sich sehr interessant an.

edit2: Hab mir "tee" gerade in der Python Library Reference angesehen. Das ist gut zu wissen, aber meine Idee mit der Liste hat funktioniert und ist einfachst zu benutzen. Trotzdem vielen Dank für den Hinweis.
Antworten