Verständnisprobleme mit Schleife und while

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
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Hallo

Ich habe eine große CSV Datei zum auswerten - leider können die freien Office Programme die Datei nicht richtig darstellen (teilweise zu viele Zeilen pro Zelle).

Jedenfalls habe ich mir zum auswerten ein Skript ǵeschrieben, dass soweit auch funktioniert. Allerdings hätte ich noch ein paar Fragen dazu.

Ich poste es mal hier damit ich besser die Zeilennummern beschreiben kann: http://pastebin.com/TpvNih7Q

Ich definiere in Zeile 12

Code: Alles auswählen

tl_csv_reader = csv.DictReader(codecs.open(tl_csv_file, "rb"),delimiter=';'"
Wenn ich es nur dort definiere funktioniert das Skript 1x, sprich ein mal kann ich nach einem Code suchen und bekomme ein Ergebnis. Beim zweiten mal ist das Ergebnis immer Null. Deshalb muss ich es bei jedem Durchlauf neu definieren, Zeile 24. Das verstehe ich nicht.

Das zweite ist die Bedingung in Zeile 23,

Code: Alles auswählen

while new_search != "n":
In Zeile 43 definiere ich ja new_search aber selbst wenn der Wert dann "n" ist läuft die Schleife weiter durch.

Freue mich auf Hinweise, Danke.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Wenn du eine Datei öffnest, musst du sie auch wieder schließen:

Code: Alles auswählen

f = open('myfile.txt')
try:
    ...  # read from f
finally:
    f.close()
Oder besser:

Code: Alles auswählen

with open('myfile.txt') as f:
    ...  # read from f
Dabei wird die Datei automatisch wieder geschlossen.

[EDIT]

Das bezog sich übrigens auf deine Zeile 12. Statt

Code: Alles auswählen

tl_csv_reader = csv.DictReader(codecs.open(tl_csv_file, "rb"),delimiter=';')
also bitte

Code: Alles auswählen

with codecs.open(tl_csv_file, "rb") as tl:
    ...
    tl_csv_reader = csv.DictReader(tl,delimiter=';')
    ...
Zuletzt geändert von pillmuncher am Sonntag 7. Oktober 2012, 16:32, insgesamt 1-mal geändert.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@martinjo: Wenn der Iterator am Ende ist, dann ist er „aufgebraucht” und Du musst einen neuen erstellen. Die Definition in Zeile 12 kannst Du Dir also sparen.

Wie führst Du das ganze aus? Eventuell aus Eclipse heraus? Da ist `raw_input()` nämlich kaputt und liefert nicht das was man eigentlich erwarten würde.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Wenn der Iterator am Ende ist, dann ist er „aufgebraucht” und Du musst einen neuen erstellen.
Danke, dieses Verhalten kannte ich bisher noch nicht.
Wie führst Du das ganze aus? Eventuell aus Eclipse heraus? Da ist `raw_input()` nämlich kaputt und liefert nicht das was man eigentlich erwarten würde.
Mit dem Gnome Terminal, es wir sicher ein String "n" gespeichert.

@pillmuncher: Ich schließe die Datei in Zeile 40, trotzdem Danke für die schönen Beispiele. Habe dein EDIT gerade gelesen und habe es dementsprechend verbessert.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Die Funktion wird beendet, wenn ich "n" eingebe, nur der Aufruf für die Funktion ist ja auch eine Schleife, somit hat sich das auch gelöst :D .
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

martinjo hat geschrieben:@pillmuncher: Ich schließe die Datei in Zeile 40, trotzdem Danke für die schönen Beispiele. Habe dein EDIT gerade gelesen und habe es dementsprechend verbessert.
Nicht unbedingt ;-) with hat hier durchaus mehrere Vorteile. So kommt es durchaus mal vor, dass irgendwo eine Exception geworfen wird. Dann sind unter Umständen bereits geschriebene Daten einfach verloren. Manchmal ist das ein Problem manchmal auch nicht. Hinzu kommt, dass man so ein close gerne mal übersieht, weil man irgendwo in die Funktion nun ein return eingebaut hat und das close nie erreicht. Das wird natürlich besonders dann problematisch, wenn man viele Dateien öffnet und nicht wieder schließt. Irgendwann ist das Limit der Dateihandles erreicht und dein Programm schmiert einfach ab. Mit dem with-Statement hast du alle die Probleme nicht mehr.

Du solltest dir auch noch den Edit von pillmuncher anschauen. Du schließt zwar die zu schreibende Datei, aber nicht die zu lesende.
Das Leben ist wie ein Tennisball.
Antworten