Seite 1 von 1

for line in quelldateiobjekt: >> und kein Ende mehr

Verfasst: Donnerstag 23. Juli 2026, 13:34
von m__golbs
Hallo,

ich habe den Effekt, das ich auf eine ASCII Datei ein:

Code: Alles auswählen

quelldateiobjekt = open(namequelldatei, "r")
for line in quelldateiobjekt:
...
nutze, das Dateiende aber nicht gefunden wird, ewig läuft. Aktuell beende ich es mit schmutziger Option..

Innerhalb nutze ich noch, nach Option, andere Fileoperationen wie:

Code: Alles auswählen

	Ausgabe_dateiobjekt = open(Ausgabedateiname, "w")
	...
	Ausgabe_dateiobjekt.close()
	...
Das darf man doch grundsätzlich, oder doch nicht?

Gruß Markus

Re: for line in quelldateiobjekt: >> und kein Ende mehr

Verfasst: Donnerstag 23. Juli 2026, 14:17
von __blackjack__
@m__golbs: Wenn da kein Dateiende gefunden wird, dann hat die Datei kein Ende. Wenn sie ein Ende hat, dann wird das von so einer Schleife auch ”gefunden”, das heisst die Schleife endet dann.

Man darf in einer Schleife über die Zeilen einer Textdatei auch weitere Dateiobjekte verwenden. Was natürlich logischerweise zu einer Endlosschleife führen kann, ist wenn man in der Schleife über die Zeilen einer Textdatei an genau diese Textdatei mehr und schneller Zeilen anhängt als die umgebende Schleife liest. Denn diese Schleife kommt ja irgendwann auch zu den neu angehängten Zeilen und liest die.

Beim öffnen von Textdateien sollte man übrigens die Kodieurng explizit angeben.

Der Zusatz `objekt` ist in Namen in aller Regel nicht sinnvoll, denn in Python ist *jeder* Wert ein Objekt.

Ich sehe beim ersten Quelltextschnippsel kein ``with`` und beim Zweiten einen `close()`-Aufruf: Dateiobjekte sind Kontextmanager, die sollte man mit der ``with``-Anweisung verwenden. Also:

Code: Alles auswählen

    with open(quelldateiname, "r", encoding="ascii") as quelldatei:
        for zeile in quelldatei:
            ...
und

Code: Alles auswählen

    with open(ausgabedateiname, "w", encoding="ascii") as ausgabedatei:
        ...
    ...

Re: for line in quelldateiobjekt: >> und kein Ende mehr

Verfasst: Donnerstag 23. Juli 2026, 17:29
von DeaD_EyE
m__golbs hat geschrieben: Donnerstag 23. Juli 2026, 13:34 nutze, das Dateiende aber nicht gefunden wird, ewig läuft.
Das kann eigentlich nicht passieren. Sobald du das Dateiende erreichst, wird StopIteration ausgelöst, was die For-Schleife beendet.

Angenommen ein anderer Prozess schreibt kontinuierlich Daten in die Datei und der Python-Prozess liest kontinuierlich, sollte er irgendwann so weit sein, dass er das Ende der Datei erreicht, bevor der andere Prozess die nächsten Daten geschrieben hat.

Dann gibt es noch Pseudo-Dateien, die kein Ende haben: /dev/random, /dev/zero, /dev/urandom

Das läuft unendlich lang:

Code: Alles auswählen

with open("/dev/zero", "rb") as fd:
    buffer = bytearray(1024)
    while size := fd.readinto(buffer):
        pass
Jetzt das ⚠ gefährliche ⚠ Beispiel, dass ziemlich schnell den RAM füllt:

Code: Alles auswählen

with open("/dev/zero", "rb") as fd:
    for line in fd:
        pass
Der Grund ist ein ganz einfacher. Die Pseudo-Datei /dev/zero liefert durchgehend 0-Bytes. Der iterator von fd konsumiert so lange Daten (die im RAM landen), bis das Zeilenende b"\n" gefunden worden ist. Da bei dieser speziellen Pseudo-Datei niemals ein Zeilenende vorkommt, läuft der RAM voll. Er erreicht auch niemals das Statement pass, da der Iterator von fd damit beschäftigt ist, den RAM zu füllen.

PS: Ich beziehe mich hier ausschließlich auf Linux.