Python-Kurs / Textdateien mit with und passender Kodierung lesen und schreiben
Öffnen Sie Textdateien mit einer ausdrücklich passenden Zeichenkodierung und verwenden Sie with, damit die Datei beim Verlassen des Blocks geschlossen wird. Der Modus w kürzt eine vorhandene Datei bereits beim Öffnen; unterscheiden Sie deshalb neue Übungsdaten von Informationen, die erhalten bleiben müssen.
Dateimodus und Zeichenkodierung auswählen
| Modus | Zweck | Verhalten |
|---|---|---|
r |
Lesen | Fehlende Datei führt zu einem Fehler |
w |
Ersetzenden Inhalt schreiben | Erstellt die Datei oder kürzt vorhandenen Inhalt |
a |
Am Ende ergänzen | Erstellt die Datei, wenn sie fehlt |
x |
Nur eine neue Datei erstellen | Vorhandene Datei führt zu einem Fehler |
Die Kodierung legt fest, wie Zeichen und Bytes zusammenhängen. Geben Sie für UTF-8-Daten encoding="utf-8" an, statt sich auf einen Umgebungsstandard zu verlassen. Das macht ein falsch kodiertes Ausgangsdokument allerdings nicht nachträglich zu UTF-8. Bei einem Dekodierfehler müssen Sie dessen tatsächliche Kodierung klären.
errors="ignore" kann nicht lesbare Bytes verwerfen und dadurch Inhalt verändern. Verwenden Sie diese Einstellung nicht als allgemeine Methode, um Fehler verschwinden zu lassen. Die Einführung zum Lesen und Schreiben von Dateien sowie die Referenz zu open erklären Modi, Kodierung und Zeilenenden.
Schreiben, Anhängen und zeilenweises Lesen ausführen
Verwenden Sie einen eigenen Übungsordner mit entbehrlichen Testdaten. Das folgende Programm setzt notes-demo.txt bei jedem Start mit w zurück. Speichern Sie den vollständigen Code als text_files.py in UTF-8 und starten Sie python text_files.py mit dem Projektinterpreter. Außerhalb einer aktivierten Umgebung kann unter macOS oder Ubuntu python3 der richtige Name sein. Zusatzpakete werden nicht benötigt.
from pathlib import Path
path = Path("notes-demo.txt")
with path.open("w", encoding="utf-8", newline="\n") as f:
f.write("coffee:3500\n")
f.write("lunch:8000\n")
with path.open("a", encoding="utf-8") as f:
f.write("bus:2500\n")
with path.open("r", encoding="utf-8") as f:
for line in f:
print(line.rstrip("\n"))
Erwartete Ausgabe:
coffee:3500
lunch:8000
bus:2500
Der erste Block schreibt zwei Zeilen. Der zweite öffnet dieselbe Datei erneut im Anfügemodus und ergänzt die dritte. Der letzte Block liest die drei Zeilen nacheinander. rstrip("\n") entfernt den gelesenen Zeilenabschluss, damit print nicht durch seinen eigenen zusätzlichen Zeilenumbruch Leerzeilen erzeugt. Die englischen Namen sind unveränderte Beispieldaten.
Die erste Schreiböffnung setzt newline="\n" und verhindert dort eine Übersetzung der geschriebenen \n-Zeichen. Die Anfügeöffnung lässt newline beim Standardwert. Unter Windows kann die angehängte Zeile daher einen anderen physischen Zeilenabschluss erhalten als die ersten beiden. Beim üblichen Textlesen werden die üblichen Zeilenenden normalisiert, sodass die dargestellten drei Zeilen stimmen. Wenn ein Dateiformat einheitliche Bytes für Zeilenenden verlangt, setzen Sie die entsprechende newline-Regel bei allen Schreiböffnungen konsistent.
Leseposition und bedeutende Leerzeichen erhalten
read() liest den verbleibenden Inhalt ab der aktuellen Position als Zeichenkette. for line in f verarbeitet dagegen eine Zeile nach der anderen und eignet sich, wenn nicht der gesamte Text gleichzeitig gebraucht wird. Am Dateiende ergibt ein weiteres read() gewöhnlich eine leere Zeichenkette. Öffnen Sie die Datei erneut oder setzen Sie die Position bewusst mit seek(0) auf den Anfang, wenn Sie erneut lesen möchten.
strip() würde nicht nur Zeilenenden, sondern auch äußere Leerzeichen entfernen. Wenn Einrückungen oder abschließende Leerzeichen Daten sind, wäre das eine unbeabsichtigte Änderung. Die begrenzte Variante im Beispiel entfernt nur \n-Zeichen am Ende. Beachten Sie dabei, dass die Textleseschicht die physischen Zeilenenden bereits umwandeln kann. Ein Textvergleich und ein Vergleich der gespeicherten Bytes beantworten daher unterschiedliche Fragen.
Bei FileNotFoundError prüfen Sie zuerst den aufgelösten Pfad, den Arbeitsordner und vorhandene Elternordner. Bei UnicodeDecodeError prüfen Sie die tatsächliche Dateikodierung. Bei PermissionError kommen Zugriffsrechte, eine Sperre durch ein anderes Programm oder ein unpassendes Ziel in Betracht; ein Verzeichnis als Dateiziel kann je nach System auch einen anderen passenden Betriebssystemfehler auslösen. Die pathlib-Übung zu Pfaden und Arbeitsverzeichnis hilft, das wirklich verwendete Ziel zu bestimmen.
Wiederholte Ausführung und Schutz wichtiger Originale prüfen
- Starten Sie das ursprüngliche Programm zweimal. Es sollen beide Male genau die drei gezeigten Zeilen erscheinen, weil der erste Block die Datei jedes Mal neu aufbaut.
- Ändern Sie nur die erste Öffnung von
wzuaund starten Sie erneut. Die vorhandenen drei Zeilen bleiben bestehen, anschließend kommen weitere drei hinzu. Die Änderung verhindert das Zurücksetzen und kann bei Wiederholung Duplikate erzeugen. - Stellen Sie den ersten Modus auf
wzurück. Ein erneuter Start muss die ursprünglichen drei Zeilen wiederherstellen. - Wenn Sie ausschließlich eine neue Ausgabe erlauben möchten, verwenden Sie für einen getrennten Test
x. Bei bereits vorhandenem Ziel erwarten SieFileExistsError; dieser Modus ist keine automatische Auswahl eines neuen Dateinamens.
with schließt eine erfolgreich geöffnete Datei auch beim Verlassen des Blocks durch eine Ausnahme. Es stellt aber vorher gekürzten Inhalt nicht wieder her und setzt bereits geschriebene Teile nicht zurück. Wurde eine wichtige Datei mit w geöffnet, kann sie nach einem Fehler leer oder nur teilweise neu geschrieben sein.
Bei wichtigen Daten sollten Sie deshalb eine passende Sicherung und eine getrennte temporäre Ausgabe erwägen, diese validieren und erst danach nach einer ausdrücklich festgelegten Ersetzungsregel übernehmen. Auch dieser Ablauf braucht eine Fehlerbehandlung, die zu Dateisystem und Anwendung passt. Ersetzen Sie nicht jeden Lesefehler pauschal durch eine leere Zeichenkette: Eine leere Datei und eine nicht lesbare oder fehlende Datei sind fachlich unterschiedliche Zustände.




