Seite 1 von 1

Warum macht er das??

Verfasst: Sonntag 19. November 2006, 22:07
von rolgal_reloaded
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

Verfasst: Sonntag 19. November 2006, 22:12
von Rebecca
Ohne die while-Schleife wuerdest du nur die erste Zeile der Datei lesen. readline liest halt immer nur eine Zeile.

Verfasst: Sonntag 19. November 2006, 22:13
von rolgal_reloaded
Ja, aber es geht doch auch anders.
readlines oder?

Ich habe nie eine Whileschleife gebraucht.

LG

rolgal_reloaded

Verfasst: Sonntag 19. November 2006, 22:22
von Matflasch
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 ;)

Verfasst: Sonntag 19. November 2006, 22:28
von rolgal_reloaded

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

Re: Warum macht er das??

Verfasst: Sonntag 19. November 2006, 22:32
von gerold
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
:-)

Verfasst: Sonntag 19. November 2006, 22:33
von Michael Schneider
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

Verfasst: Sonntag 19. November 2006, 22:36
von rolgal_reloaded
@gerold,

dein letztes Beispiel gefällt mir auch gut.

LG

rolgal_reloaded

Verfasst: Sonntag 19. November 2006, 22:39
von rolgal_reloaded
@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

Re: Warum macht er das??

Verfasst: Montag 20. November 2006, 11:02
von Leonidas
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.

Verfasst: Montag 20. November 2006, 11:28
von Matflasch
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

Verfasst: Montag 20. November 2006, 11:54
von gerold
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
:-)