with open(...) as f: ist der Standardweg, um mit Dateien über einen Kontext-Manager zu arbeiten. Bei diesem Ansatz garantiert Python das automatische Schließen der Datei beim Verlassen des with-Blocks, selbst wenn eine Ausnahme auftritt. Dies schließt das Auslaufen von Dateideskriptoren und Dateisperren aus.
Innerhalb des Blocks kann man mit der Datei arbeiten, indem man die Methoden des Objekts verwendet (f.read(), f.write() usw.). Nach dem Verlassen des Blocks (selbst bei einem Fehler) wird die Methode f.close() aufgerufen.
Beispiel:
with open('data.txt', 'w') as f: f.write('Hello!') # Hier ist die Datei bereits geschlossen
Häufige Frage:
Kann man sicher sein, dass eine durch
opengeöffnete Datei direkt nach Verlassen deswith-Blocks geschlossen wird, selbst wenn eine Ausnahme in der Mitte des Blocks auftritt?
Antwort: Ja, genau das garantiert der Vertrag des Kontext-Managers: Unabhängig von Ausnahmen wird die Methode __exit__ beim Verlassen des Blocks aufgerufen, was zum Schließen der Datei führt. Dies ist der Hauptvorteil im Vergleich zu einem expliziten Aufruf von f.close().
Geschichte
In einem großen Projekt wurden Protokolle über open('log.txt', 'a') und einen expliziten Aufruf von f.write() geschrieben, dabei wurde jedoch f.close() vergessen. Nach längerer Arbeit verbrauchte der Prozess alle Dateideskriptoren des Betriebssystems, der Dienst hörte auf zu arbeiten.
Geschichte
Im Überwachungssystem wurde ständig Dateien über open geöffnet, ohne Ausnahmen zu behandeln. Bei Auftreten eines Fehlers blieb die Datei offen, was zu Sperren führte, wenn versucht wurde, sie aus einem anderen Prozess erneut zu öffnen.
Geschichte
Ein Entwickler implementierte das Lesen einer großen Datei über open und stellte sofort in der Mitte der Funktion return bereit, ohne die Datei zu schließen. Infolgedessen führten mehrere solcher Operationen zu einer Überlastung der Dateiresourcen und das Betriebssystem begann, neue Öffnungen zu blockieren.