Voraussetzungen
Du kennst die Inhalte aus Teil 13 und arbeitest mit einem lokalen Python-3-Interpreter (ab Python 3.10), beispielsweise in Thonny.
Das lernst du in dieser Lektion
- Path importieren.
- Dateien mit UTF-8 lesen und schreiben.
- Schreibmodi und Arbeitsverzeichnis unterscheiden.
Nach dem Beenden bleiben Daten erhalten
Variablen verschwinden beim Programmende. Eine Datei bleibt auf dem Datenträger erhalten. Wir schreiben eine kleine Notizdatei neben unser gespeichertes Python-Skript:
from pathlib import Path
basis = Path(__file__).resolve().parent
pfad = basis / "notizen.txt"
pfad.write_text("Projekt: Universalhalter\nMaterial: PLA\n", encoding="utf-8")
inhalt = pfad.read_text(encoding="utf-8")
print(inhalt)
print(f"Gespeichert unter: {pfad}")
Speichere als notizen.py und führe die ganze Datei aus. from pathlib import Path holt einen Baustein der Standardbibliothek ins Programm; Module betrachten wir im nächsten Teil genauer. Der Operator / setzt bei Path Pfadbestandteile zusammen. Du musst keine betriebssystemspezifischen Schrägstriche einbauen.
__file__ bezeichnet bei einem ausgeführten Skript dessen Datei. .resolve().parent ermittelt ihren absoluten Elternordner. In einer interaktiven Shell oder in einem Notebook kann __file__ fehlen. Führe diese Beispiele deshalb als gespeicherte .py-Dateien aus.
Arbeitsverzeichnis und Skriptordner
Path("notizen.txt") würde eine Datei im aktuellen Arbeitsverzeichnis ansprechen. Das ist nicht zwingend der Ordner des Skripts. Den aktuellen Arbeitsordner zeigt Path.cwd(). Unsere Beispiele verankern die Daten bewusst am Skriptordner. Verwende dafür einen Ordner, in den du schreiben darfst, beispielsweise deinen eigenen Kursordner.
Schreiben überschreibt
write_text() ersetzt vorhandenen Inhalt. Benutze für die Übungen neue Testdateien. Wenn du mehrere Zeilen kontrolliert anfügen möchtest, verwende einen with-Block:
from pathlib import Path
pfad = Path(__file__).resolve().parent / "protokoll.txt"
with pfad.open("a", encoding="utf-8") as datei:
datei.write("Ein weiterer Testlauf\n")
with pfad.open("r", encoding="utf-8") as datei:
for zeile in datei:
print(zeile.rstrip("\n"))
"r" bedeutet lesen, "w" neu schreiben beziehungsweise überschreiben, "a" anhängen. Ein with-Block schließt die Datei auch dann, wenn im Block eine Ausnahme auftritt. \n ist im Python-String ein Zeilenumbruch. encoding="utf-8" legt fest, wie Zeichen gespeichert werden, und hilft bei Umlauten.
Fehlende Dateien
Wenn du eine noch nicht vorhandene Datei lesen möchtest, entsteht ein FileNotFoundError. Fange ihn bei Bedarf gezielt ab und zeige „Noch keine Notizen vorhanden“. Nicht jeder Dateifehler ist eine fehlende Datei: Fehlende Rechte oder ein voller Datenträger benötigen eine andere Reaktion.
Mitmach-Aufgabe
Lege werkstatt.txt mit zwei Werkzeugnamen an. Lies die Datei wieder ein und gib ihren absoluten Pfad aus. Starte zweimal und beobachte, ob Zeilen angehängt oder ersetzt werden.
Versuche die Aufgabe zuerst selbst. Vergleiche danach deinen Ansatz mit der Musterlösung. Andere Lösungen sind möglich, wenn sie dieselben Anforderungen erfüllen.
Musterlösung
from pathlib import Path
pfad = Path(__file__).resolve().parent / "werkstatt.txt"
pfad.write_text("Messschieber\nFeile\n", encoding="utf-8")
print(pfad.read_text(encoding="utf-8"))
print(pfad)
Ergebnis prüfen
Die Datei enthält nach jedem Start genau zwei Werkzeugzeilen. Die genaue Pfadausgabe hängt von deinem Rechner ab.
Typische Stolperstellen
Ein relativer Pfad bezieht sich auf das Arbeitsverzeichnis. "w" und write_text() überschreiben. __file__ funktioniert in dieser Form nur im Skriptkontext.
Was du jetzt kannst
- Path importieren.
- Dateien mit UTF-8 lesen und schreiben.
- Schreibmodi und Arbeitsverzeichnis unterscheiden.
Passendes Cheatsheet
Zum Nachschlagen: Cheatsheet 11 – Dateien lesen und schreiben. Dort findest du auch den vorhandenen PDF-Download.
Im nächsten Teil
In Teil 15 geht es um Module, eigene Dateien und virtuelle Umgebungen. Nutze die Standardbibliothek, teile Code auf und lerne das Prinzip isolierter Projektumgebungen kennen.
