Verwenden von Kontext-Managern zur Steuerung
In diesem Schritt lernen Sie, wie Sie in Python Kontext-Manager (Context Managers) verwenden können, um die Ausnahmebehandlung zu vereinfachen und sicherzustellen, dass Ressourcen ordnungsgemäß verwaltet werden, auch wenn Ausnahmen auftreten. Kontext-Manager sind besonders nützlich, wenn Sie mit Dateien, Netzwerkverbindungen und anderen Ressourcen arbeiten, die explizit geschlossen oder freigegeben werden müssen.
Ein Kontext-Manager ist ein Objekt, das die Methoden __enter__
und __exit__
definiert. Die with
-Anweisung wird verwendet, um einen Codeblock im Kontext eines Kontext-Managers auszuführen. Die __enter__
-Methode wird aufgerufen, wenn der with
-Block betreten wird, und die __exit__
-Methode wird aufgerufen, wenn der with
-Block verlassen wird, unabhängig davon, ob eine Ausnahme aufgetreten ist.
Beginnen wir mit einem einfachen Beispiel für das Lesen einer Datei mit einem Kontext-Manager.
-
Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.
-
Erstellen Sie eine neue Datei namens file_handling.py
im Verzeichnis ~/project
.
touch ~/project/file_handling.py
-
Bearbeiten Sie die Datei file_handling.py
und fügen Sie den folgenden Code hinzu:
## file_handling.py
filename = "my_file.txt"
try:
with open(filename, "w") as f:
f.write("Hello, LabEx!\n")
f.write("This is a test file.\n")
except IOError as e:
print(f"An I/O error occurred: {e}")
try:
with open(filename, "r") as f:
content = f.read()
print("File content:")
print(content)
except FileNotFoundError:
print(f"The file '{filename}' was not found.")
except IOError as e:
print(f"An I/O error occurred: {e}")
In diesem Code:
- Wir verwenden die Anweisung
with open(filename, "w") as f:
, um die Datei my_file.txt
im Schreibmodus ("w"
) zu öffnen. Die open()
-Funktion gibt ein Dateiobjekt zurück, das der Variablen f
zugewiesen wird.
- Die
with
-Anweisung stellt sicher, dass die Datei automatisch geschlossen wird, wenn der Block verlassen wird, auch wenn eine Ausnahme auftritt.
- Wir schreiben zwei Zeilen Text in die Datei mit der Methode
f.write()
.
- Anschließend verwenden wir die Anweisung
with open(filename, "r") as f:
, um dieselbe Datei im Lesemodus ("r"
) zu öffnen.
- Wir lesen den gesamten Inhalt der Datei mit der Methode
f.read()
und geben ihn auf der Konsole aus.
- Wir umschließen die Dateioperationen in
try...except
-Blöcken, um potenzielle FileNotFoundError
- und IOError
-Ausnahmen zu behandeln.
-
Führen Sie das Skript aus:
python ~/project/file_handling.py
Ausgabe:
File content:
Hello, LabEx!
This is a test file.
Wenn die Datei my_file.txt
nicht existiert, wird das Skript sie erstellen und den angegebenen Inhalt schreiben. Wenn die Datei bereits existiert, wird ihr Inhalt überschrieben. Die with
-Anweisung stellt sicher, dass die Datei in beiden Fällen ordnungsgemäß geschlossen wird.
Betrachten wir ein weiteres Beispiel, bei dem während der Dateiverarbeitung eine Ausnahme auftreten könnte:
## file_handling.py
filename = "my_file.txt"
try:
with open(filename, "r") as f:
for line in f:
## Simulate an error during processing
if "test" in line:
raise ValueError("Simulated error during processing")
print("Line:", line.strip())
except FileNotFoundError:
print(f"The file '{filename}' was not found.")
except ValueError as e:
print(f"A value error occurred: {e}")
except IOError as e:
print(f"An I/O error occurred: {e}")
In diesem Beispiel simulieren wir einen Fehler, indem wir einen ValueError
auslösen, wenn die Zeile das Wort "test" enthält. Auch wenn dieser Fehler auftritt, stellt die with
-Anweisung sicher, dass die Datei ordnungsgemäß geschlossen wird.
Führen Sie das Skript aus:
python ~/project/file_handling.py
Ausgabe:
Line: Hello, LabEx!
A value error occurred: Simulated error during processing
Kontext-Manager bieten eine saubere und zuverlässige Möglichkeit, Ressourcen zu verwalten und Ausnahmen in Python zu behandeln. Sie stellen sicher, dass Ressourcen ordnungsgemäß freigegeben werden, auch wenn Fehler auftreten, was Ihren Code robuster und leichter wartbar macht.