HOWTO · Python
Open-File-Ausnahmebehandlung in Python
Wenn in Python die Datei, auf die wir zugreifen möchten, nicht existiert, wird eine als `FileNotFoundError` bekannte Ausnahme ausgelöst. In diesem Artikel erfahren Sie, wie Sie die Ausnahme abfangen und den Rest des Codes ausführen.
Auf dieser Seite
Wenn Python den an open() übergebenen Pfad nicht findet, löst es FileNotFoundError aus. Fangen Sie diesen spezifischen Fehler direkt beim Öffnen ab, wählen Sie eine sinnvolle Maßnahme zur Fehlerbehandlung und lassen Sie das übrige Programm weiterlaufen. Mit with open(...) wird eine erfolgreich geöffnete Datei zuverlässig geschlossen.
Dateimodi und Rückgabewert von open()
Die eingebaute Funktion open() erhält einen Pfad und einen Modus und gibt ein Dateiobjekt zurück. Beim Aufruf lädt sie nicht den gesamten Dateiinhalt; Methoden wie read() rufen den Inhalt anschließend ab. Der Standardmodus r öffnet eine Textdatei zum Lesen und setzt voraus, dass der Pfad auf eine vorhandene Datei verweist. Mit w erstellen oder überschreiben Sie eine Datei, mit a hängen Sie Daten an eine Datei an. Diese Schreibmodi können eine fehlende Datei erstellen; verwenden Sie sie daher nur, wenn Sie tatsächlich schreiben möchten. Fügen Sie einem Modus wie rb ein b hinzu, wenn Sie mit Bytes statt mit dekodiertem Text arbeiten.
Ein relativer Pfad wird ausgehend vom aktuellen Arbeitsverzeichnis des Prozesses aufgelöst. Dieses Verzeichnis kann sich von dem Ordner unterscheiden, in dem das Python-Skript liegt. Wenn ein Pfad unerwartet fehlschlägt, überprüfen Sie den genauen Dateinamen und seine Schreibweise, die übergeordneten Verzeichnisse sowie das Arbeitsverzeichnis des Programms. Ein absoluter Pfad vermeidet diese Abhängigkeit, muss aber weiterhin auf eine zugängliche Datei verweisen.
Führen Sie dieses Beispiel aus. Die sichtbaren Beschriftungen und Ausgaben im unveränderten Beispielblock bleiben auf Englisch:
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "notes.txt"
path.write_text("Read this line.", encoding="utf-8")
with path.open(encoding="utf-8") as file:
print(file.read())
Read this line.
Warum open() FileNotFoundError auslöst
Im Lesemodus löst das Öffnen eines Pfads, der keine vorhandene Datei bezeichnet, direkt beim Aufruf von open() FileNotFoundError aus. Python gibt den verwendeten Pfad an; ein relativer Pfad wird ausgehend vom aktuellen Arbeitsverzeichnis interpretiert. Häufig läuft das Programm in einem anderen Verzeichnis als erwartet, oder ein Dateiname beziehungsweise ein Verzeichnisbestandteil ist falsch geschrieben. Der Fehler tritt beim Öffnen der Datei auf, bevor ein Dateiobjekt verfügbar ist. Ein späterer Aufruf von read() ist also nicht die Ursache.
Derselbe Fehler kann auftreten, wenn ein übergeordnetes Verzeichnis im angegebenen Pfad nicht existiert. Eine vorherige Prüfung, ob der Pfad vorhanden ist, kann bei der Diagnose helfen. Sie verhindert jedoch nicht, dass sich die Datei zwischen der Prüfung und dem Öffnen ändert. Wenn das Programm den Fehler behandeln soll, fangen Sie das Ergebnis des Öffnungsversuchs selbst ab.
Fehler beim Öffnen von Dateien mit try und except behandeln
Führen Sie den Vorgang, bei dem ein Fehler auftreten kann, in einem try-Block aus und nennen Sie FileNotFoundError in der passenden except-Klausel. Wird dieser Fehler ausgelöst, überspringt Python die übrigen Anweisungen im try-Block und führt den passenden Fehlerbehandlungsblock aus. Danach wird das Programm hinter der gesamten try/except-Anweisung fortgesetzt. Tritt eine andere Ausnahme auf und gibt es dafür keinen passenden Fehlerbehandlungsblock, wird sie an den Aufrufer weitergegeben. Das Abfangen dieses einen Fehlers löst nicht alle Probleme beim Dateizugriff.
Mit with open(...) wird die Datei geschlossen, wenn der zugehörige Block endet, auch wenn nach einem erfolgreichen Öffnen ein Fehler auftritt. Schlägt das Öffnen fehl, beginnt der with-Block gar nicht erst. Wählen Sie eine Maßnahme, die für das umgebende Programm hilfreich ist: Sie können beispielsweise den fehlenden Pfad ausgeben, den Aufrufer nach einem anderen Pfad fragen oder auf einen dokumentierten Ersatz zurückgreifen. Behandeln Sie fehlende Eingaben nicht stillschweigend als gültige Daten.
Führen Sie dieses Beispiel aus. Die sichtbaren Beschriftungen und Ausgaben im unveränderten Beispielblock bleiben auf Englisch:
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "missing.txt"
try:
with path.open(encoding="utf-8") as file:
print(file.read())
except FileNotFoundError:
print("Input file was not found; continuing without it.")
print("Program continues.")
Input file was not found; continuing without it.
Program continues.