„with“-Schlüsselwort in Python-Ausnahmen

Document 对象参考手册Python3-Fehler und Ausnahmen

In Python wird diewith-Anweisung zur Ausnahmebehandlung verwendet und kapselttry…except…finallyProgrammierparadigmen, wodurch die Benutzerfreundlichkeit verbessert wird.

with-Anweisung macht den Code klarer und besser lesbar und vereinfacht die Verwaltung gemeinsamer Ressourcen wie Dateiströme.

Die Verwendung des with-Schlüsselworts bei der Behandlung von Dateiobjekten ist eine gute Praxis.

Wir können uns die folgenden Codebeispiele ansehen:

Ohne Verwendung vonwithund ohne Verwendung vontry…except…finally

Beispiel

file = open('./test_example.txt', 'w')
file.write('hello world !')
file.close()

Wenn im obigen Code während des Aufrufs von write eine Ausnahme auftritt, wird die Methode close nicht ausgeführt, sodass die Ressource vom Programm belegt bleibt und nicht freigegeben werden kann.

Weitere Referenzen zum Python-with-Schlüsselwort:https://www.example.com/python3/python3-with-keyword.html

Als Nächstes können wirtry…except…finallyverwenden, um den Code zu verbessern:

Beispiel

file = open('./test_example.txt', 'w')
try:
    file.write('hello world')
finally:
    file.close()

Im obigen Code verwenden wir try, um Ausnahmen dort abzufangen, wo sie auftreten können. Wenn eine Ausnahme auftritt, wird der except-Block ausgeführt, und der finally-Block wird in jedem Fall ausgeführt, sodass die Datei geschlossen wird und Ressourcen nicht durch Ausnahmen während der Ausführung belegt werden.

Verwendung deswith-Schlüsselworts:

Beispiel

with open('./test_example.txt', 'w') as Datei:
    file.write('hello world !')

Wenn man daswith-Schlüsselwort verwendet, ruft das System automatisch die Methode f.close() auf, und die Wirkung von with entspricht der try/finally-Anweisung.

Wir können prüfen, ob die Datei geschlossen ist, nachdem das with-Schlüsselwort ausgeführt wurde:

Beispiel

>>> with open('./test_example.txt') as f:
...     read_data = f.read()

>>> # Überprüfen, ob die Datei geschlossen ist
>>> f.geschlossen
True

Das Implementierungsprinzip der with-Anweisung baut auf dem Kontextmanager auf.

Ein Kontextmanager ist eine Klasse, die die__enter__-und__exit__-Methode implementiert.

Die Verwendung der with-Anweisung stellt sicher, dass die __exit__-Methode am Ende des verschachtelten Blocks aufgerufen wird.

Dieses Konzept ähnelt der Verwendung von try...finally-Blöcken.

Beispiel

with open('./test_example.txt', 'w') as my_file:
    my_file.write('hello world!')

Das obige Beispiel schreibthello world!in die Datei ./test_example.txt.

Im Dateiobjekt sind die Methoden __enter__ und __exit__ definiert, was bedeutet, dass das Dateiobjekt auch den Kontextmanager implementiert. Zuerst wird die Methode __enter__ aufgerufen, dann wird der Code in der with-Anweisung ausgeführt und schließlich wird die Methode __exit__ aufgerufen. Selbst wenn ein Fehler auftritt, wird die Methode __exit__ weiterhin aufgerufen, was bedeutet, dass der Dateistream geschlossen wird.

Beispiel

Der folgende Python-Code ist ein einfaches Reiseplan-Verwaltungstool, das eine Liste von Städten aus der Datei 5A.txt liest und die folgenden Funktionen bereitstellt:

  1. Städteliste lesen: Liest Städtenamen, die mit einer Zahl beginnen, aus der Datei und fügt sie der Reiseplanliste hinzu.

  2. Städte löschen: Benutzer können die Nummer und Indizes der Städte eingeben, die sie nicht besuchen möchten, und die entsprechenden Städte werden aus dem Plan entfernt.

  3. Städte ändern: Benutzer können die Namen bestimmter Städte ändern, um den Reiseplan zu aktualisieren.

  4. Zufälligen Reiseplan generieren: Die Reihenfolge der Städte mischen und die ersten fünf Städte als endgültige Reiseempfehlung anzeigen.

Jede Zeile in der Datei 5A.txt enthält einen Städtenamen, der mit einer Zahl beginnt:

1. 北京
2. 上海
3. 广州
4. 深圳
5. 成都
6. 杭州
7. 西安
8. 重庆
9. 南京
10. 苏州

Beispiel

from random import shuffle

try:
    with open('5A.txt', 'r') as fp:
        i = [line for line in fp if line[0].isdigit()]
except FileNotFoundError:
    print("Datei '5A.txt' nicht gefunden, bitte überprüfen Sie den Dateipfad.")
    exit()

travelList = []

# Reisestädte hinzufügen
for index, item in enumerate(i):
    temp_1 = item.strip()[2:]  # strip verwenden, um den Zeilenumbruch am Ende der Zeile zu entfernen
    temp_1 = f"{index}#{temp_1}"
    travelList.append(temp_1)

print("Städte im Reiseplan:", travelList)

# Reiseziele löschen
city_num = input('Geben Sie die Anzahl der Städte ein, die Sie nicht besuchen möchten:')
try:
    for _ in range(int(city_num)):
        index = int(input('Geben Sie die Indizes der Städte ein, die Sie nicht besuchen möchten (die erste Stadt hat den Index 0)'))
        if 0 <= index < len(travelList):
            travelList.pop(index)
            print("Städte im Reiseplan:", travelList)
        else:
            print("Der eingegebene Index liegt außerhalb des gültigen Bereichs.")
except ValueError:
    print("Bitte geben Sie eine gültige ganze Zahl ein.")

# Reiseziele ändern
city_num = input('Geben Sie die Anzahl der Städte ein, die im Reiseplan geändert werden sollen:')
try:
    for _ in range(int(city_num)):
        index = int(input('Geben Sie die Indizes der Städte ein, die im Reiseplan geändert werden sollen (die erste Stadt hat den Index 0)'))
        if 0 <= index < len(travelList):
            city_name = input('Geben Sie die Namen der Städte ein, die im Reiseplan geändert werden sollen:')
            travelList[index] = city_name
            print('Städte im Reiseplan:', travelList)
        else:
            print("Der eingegebene Index liegt außerhalb des gültigen Bereichs.")
except ValueError:
    print("Bitte geben Sie eine gültige ganze Zahl ein.")

shuffle(travelList)
print('Bitte holen Sie Ihren TOPS-Reiseplan ab:', travelList[:5])

Die Ausführung des obigen Codes erzeugt eine Ausgabe ähnlich der folgenden:

旅游计划城市: ['0# 北京', '1# 上海', '2# 广州', '3# 深圳', '4# 成都', '5# 杭州', '6# 西安', '7# 重庆', '8# 南京', '9#. 苏州']
输入不想旅游城市的个数:0
输入修改计划旅游的城市个数:3
输入修改计划旅游的城市序号(第1个城市索引为0)4
输入修改计划旅游的城市名称:7
旅游计划城市: ['0# 北京', '1# 上海', '2# 广州', '3# 深圳', '7', '5# 杭州', '6# 西安', '7# 重庆', '8# 南京', '9#. 苏州']

Document 对象参考手册Python3-Fehler und Ausnahmen

Weitere Erweiterungen