Python Lernhandbuch

Kapitel 8: Fehlerbehandlung und Dateien

Musterlösung mit Erklärung

Deine Lösung hat die Prüfung noch nicht bestanden. Lies die Erklärung, dann versuche es erneut – möglichst ohne abzuschreiben.
Aufgabe noch einmal lesen

Eine Logdatei server.log hat Zeilen wie:

text
2026-10-20 08:15:01 INFO Server gestartet
2026-10-20 08:15:07 ERROR Datenbank nicht erreichbar
2026-10-20 08:16:00 WARNING Speicher knapp
2026-10-20 08:16:30 ERROR Zeitüberschreitung

Schreibe ein Programm, das:

  1. die Datei zeilenweise einliest und zählt, wie viele Zeilen es pro Stufe (INFO, WARNING, ERROR) gibt,
  2. alle ERROR-Zeilen in die Datei errors.txt schreibt,
  3. eine verständliche Meldung ausgibt und nicht abstürzt, wenn server.log nicht existiert.
python
from pathlib import Path

quelle = Path('server.log')
ziel = Path('errors.txt')

try:
    zaehler = {}
    with quelle.open(encoding='utf-8') as eingabe, ziel.open('w', encoding='utf-8') as ausgabe:
        for zeile in eingabe:
            teile = zeile.split(maxsplit=3)     # Datum, Uhrzeit, Stufe, Rest
            if len(teile) < 3:
                continue                         # kaputte Zeile überspringen
            stufe = teile[2]
            zaehler[stufe] = zaehler.get(stufe, 0) + 1
            if stufe == 'ERROR':
                ausgabe.write(zeile)
except FileNotFoundError:
    print(f'Datei {quelle} nicht gefunden')
else:
    for stufe, n in sorted(zaehler.items()):
        print(f'{stufe}: {n}')

Was passiert:

  • quelle.open(...) ist die Path-Schreibweise von open(quelle, ...). Mit einem einzigen with werden zwei Dateien geöffnet und am Ende beide geschlossen.
  • zeile.split(maxsplit=3) zerlegt höchstens an drei Stellen. So landet der Rest der Zeile (die Meldung, die selbst Leerzeichen enthält) unzerteilt im vierten Element. Das Element mit Index 2 ist die Stufe.
  • Die Prüfung len(teile) < 3 verhindert einen IndexError bei leeren oder kaputten Zeilen. continue springt zur nächsten Zeile.
  • Wenn server.log fehlt, löst open einen FileNotFoundError aus. Der except-Block fängt genau diesen Fehler ab und gibt eine verständliche Meldung aus.
  • Der else-Block läuft nur, wenn alles geklappt hat. Dort steht die Ausgabe der Zählung, denn sie soll nicht erscheinen, wenn die Datei fehlt.

Warum so: Gefangen wird gezielt der eine erwartbare Fehler, alle anderen (zum Beispiel ein Programmierfehler) sollen sichtbar bleiben. Zeilenweises Lesen ist speicherschonend und funktioniert auch bei Gigabyte-Dateien.