Warum macht er das??

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
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Hallo zusammen,


http://abop-german.berlios.de/read/io.html


Auf der Seite gibts ein Beispiel für die Verwendung von file.
Wofür ist die Whileschleife gut :?:

Bringt das irgendwas :?:

Liebe Grüße

rolgal_reloaded
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ohne die while-Schleife wuerdest du nur die erste Zeile der Datei lesen. readline liest halt immer nur eine Zeile.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Ja, aber es geht doch auch anders.
readlines oder?

Ich habe nie eine Whileschleife gebraucht.

LG

rolgal_reloaded
Benutzeravatar
Matflasch
User
Beiträge: 41
Registriert: Donnerstag 25. März 2004, 15:42
Wohnort: Hamburg
Kontaktdaten:

Einfach mit einer for-each-Schleife über den Iterator, den dir fp.readlines() gibt iterieren, somit liest du Zeile für Zeile aus, ohne eine "while True:"-Schleife mit nem nicht so schönen break zu verwenden ;)
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Code: Alles auswählen

>>> f=file('C:\\Dokumente und Einstellungen\\rolgal\\Eigene Dateien\\test.txt', 'r')
>>> zeilen = f.readlines()
>>> for zeile in zeilen:
	print zeile,
Genau, ich finde das auch wesentlich sinniger. Die Whileschleife ist hier meiner meinung nach didaktischer Unsinn :!:

LG

rolgal reloaded
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

rolgal_reloaded hat geschrieben:Wofür ist die Whileschleife gut :?:
Bringt das irgendwas :?:
Hi rolgal_reloaded!

Das ist schnell, liest die Datei aber auch komplett in den Speicher. Nicht geeignet für große Dateien:

Code: Alles auswählen

f = file("dateiname.txt", "r")
lines = f.readlines()
f.close()
print lines
Wenn man nicht weiß, dass man über ``f`` iterieren kann, dann geht es z.B. so:

Code: Alles auswählen

f = file("dateiname.txt", "r")
while True:
    line = f.readline()
    if not line:
        break
    print line
f.close()
...oder so:

Code: Alles auswählen

f = file("dateiname.txt", "r")
for line in iter(f.readline, ""):
    print line
f.close()
Wenn man weiß, dass man über ``f`` iterieren kann, dann so:

Code: Alles auswählen

f = file("dateiname.txt", "r")
for line in f:
    print line
f.close()
lg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 19. November 2006, 22:33, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Matflasch hat geschrieben:Einfach mit einer for-each-Schleife über den Iterator, den dir fp.readlines() gibt iterieren, somit liest du Zeile für Zeile aus, ohne eine "while True:"-Schleife mit nem nicht so schönen break zu verwenden ;)
Hi Matflasch,

ich weiß nicht, welche Python Version Du verwendest. Bei mir unter 2.4 liefert ein einfaches fp.readlines() eine Liste, keinen Iterator. Und genau deshalb ist es bei großen Dateien eben nicht sinnvoll, die ganze Datei auf einmal zu lesen. Erstens kann dadurch der Arbeitsspeicher gesprengt werden, zum anderen werden Listen mit mehreren tausend oder millionen von Elementen einfach grottenlangsam. :roll:
Deshalb: Datei nur ganz einlesen, wenn sie nicht evtl. kritische Größen erreicht.

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

@gerold,

dein letztes Beispiel gefällt mir auch gut.

LG

rolgal_reloaded
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

@Matflasch,

ah, du hast gleich so gemeint:

Code: Alles auswählen

>>> f=file('C:\\Dokumente und Einstellungen\\rolgal\\Eigene Dateien\\test.txt', 'r')
>>> for zeile in f.readlines():
	print zeile,

Für Anfänger finde ich mein vorhin genanntes Beispiel besser.
Aber schön zu wissen, dass es so auch geht, geil.

LG

rolgal_reloaded
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:Wenn man weiß, dass man über ``f`` iterieren kann, dann so:

Code: Alles auswählen

f = file("dateiname.txt", "r")
for line in f:
    print line
f.close()
Im What's new in Python 2.5 gibt es auch ein Beispiel mit dem neuen `with`-Statement.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Matflasch
User
Beiträge: 41
Registriert: Donnerstag 25. März 2004, 15:42
Wohnort: Hamburg
Kontaktdaten:

Hmm, Ok,
musste noch nicht mit so grossen Dateien arbeiten, dass es langsam/träge wurde, bei mir hat es bisher immer gereicht mit der liste, die mit f.readlines() gibt.

Aber das werd ich dann bei Gelegenheit mal austesten, ab wann merkt man es denn schon, also ab welcher Dateigröße bzw. Zeilenanzahl?

Mfg, Matflasch
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Matflasch hat geschrieben:ab wann merkt man es denn schon, also ab welcher Dateigröße bzw. Zeilenanzahl?
Hi Matflasch!

Das hängt vom freien Speicher ab.

Auf einem Computer mit 128 MB RAM und einem installierten Windows XP (das braucht meist schon den kompletten RAM), wirst du es sicher merken, wenn du eine 20 MB große Datei in den Speicher lädst.
Ich, z.B., habe einen Laptop mit 64 MB RAM und Windows ME drauf. Da merkt man es, wenn mal eine 2 MB-Datei in den Speicher geladen wird.

Wenn du z.B. Logdateien auswerten musst, dann weißt du ja nicht, wie groß diese einmal sein werden. Ich hatte schon Apache-Log-Dateien, die 200 MB groß waren...

Es ist also fast immer besser, speicherschonend zu programmieren.

Wenn ich die Datei sowiso komplett im Speicher brauche, -- dann ist ``readlines()`` die bessere Wahl. Wenn ich die Datei zeilenweise durchlaufen kann und nach dem Betrachten der Zeile, diese wieder aus dem Speicher löschen kann, dann ist das Iterieren über die Zeilen die bessere Wahl.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten