Dateipfade in Python: Warum du pathlib statt os.path nutzen solltest
Pfade als Strings zusammenzubasteln führt schnell zu Bugs. Das pathlib-Modul macht den Umgang mit Dateien und Verzeichnissen in Python deutlich sauberer.
Fast jedes Programm muss irgendwann mit Dateien arbeiten: eine Konfiguration einlesen, ein Log schreiben, durch ein Verzeichnis wandern. Viele von uns haben dabei jahrelang Pfade als Strings zusammengesetzt – mit os.path.join, manuell eingefügten Schrägstrichen und einem mulmigen Gefühl, ob das Ganze auch unter Windows funktioniert. Seit Python 3.4 gibt es dafür eine deutlich elegantere Lösung: das pathlib-Modul. In diesem Beitrag schauen wir uns an, warum sich der Umstieg lohnt und wie du in der Praxis davon profitierst.
Das Problem mit Strings
Ein Pfad ist mehr als nur Text. Er hat eine Struktur: ein Verzeichnis, einen Dateinamen, eine Endung. Wenn du Pfade als Strings behandelst, musst du diese Struktur jedes Mal von Hand nachbilden. Das führt zu Code, der schwer zu lesen ist und auf unterschiedlichen Betriebssystemen unterschiedlich reagiert.
import os
# Der alte Weg
basis = "/home/anton/projekte"
datei = os.path.join(basis, "daten", "report.csv")
name_ohne_endung = os.path.splitext(os.path.basename(datei))[0]
Das funktioniert, ist aber umständlich. Drei verschachtelte Funktionsaufrufe, nur um den Dateinamen ohne Endung zu bekommen.
Der pathlib-Weg
Mit pathlib wird derselbe Code lesbarer, weil ein Pfad zu einem echten Objekt mit sinnvollen Eigenschaften wird. Der Star ist der /-Operator, mit dem du Pfade zusammensetzt – intuitiv und plattformunabhängig.
from pathlib import Path
basis = Path("/home/anton/projekte")
datei = basis / "daten" / "report.csv"
print(datei.name) # report.csv
print(datei.stem) # report
print(datei.suffix) # .csv
print(datei.parent) # /home/anton/projekte/daten
Kein os.path.join, kein splitext, keine verschachtelten Aufrufe. Das Path-Objekt kennt seine eigenen Bestandteile.
Verzeichnisse durchsuchen
Besonders praktisch wird es beim Durchsuchen von Ordnern. Statt os.listdir und manuellem Filtern nutzt du glob direkt auf dem Path-Objekt:
projekt = Path("/home/anton/projekte")
# Alle CSV-Dateien, auch in Unterordnern
for csv in projekt.rglob("*.csv"):
print(csv, csv.stat().st_size, "Bytes")
Auch Lesen und Schreiben geht direkt: datei.read_text(encoding="utf-8") oder datei.write_text("Hallo") ersetzen den klassischen open()-Block für einfache Fälle. Und ob eine Datei existiert, fragst du mit datei.exists() ab.
Wann du wechseln solltest
Die kurze Antwort: in fast jedem neuen Projekt. pathlib ist Teil der Standardbibliothek, du musst also nichts installieren, und der Code liest sich näher an dem, was du eigentlich meinst. Für Sonderfälle – etwa wenn eine ältere Bibliothek zwingend einen String erwartet – wandelst du das Objekt einfach mit str(datei) zurück.
Wer richtig tief in das Thema einsteigen will, dem sei unser englischsprachiges Schwesterblog pykit.org empfohlen. Dort gibt es einen sehr ausführlichen, praxisnahen Deep Dive, der auch die feineren Unterschiede zwischen os.path und pathlib beleuchtet und typische Stolperfallen zeigt: "Stop Using os.path: A Practical Deep Dive into Python's pathlib". Der Artikel ergänzt diesen Einstieg perfekt, wenn du die englische Sprache nicht scheust.
Unterm Strich gilt: Sobald du Pfade nicht mehr als bloße Zeichenketten, sondern als strukturierte Objekte begreifst, wird dein Code kürzer, sicherer und leichter zu warten. Ein kleiner Umstieg mit großer Wirkung.