Abschnitt 11 · Lektion 4
Pfade
Ein Pfad (path) sagt, wo eine Datei liegt. Erst kommen die Ordner, dann der Name, getrennt durch
Schrägstriche. downloads/Bilder/IMG_4711.JPG ist die Datei IMG_4711.JPG im Ordner Bilder, und
der liegt in downloads. Bisher standen Pfade als fertiger Text im Code. Sobald ein Programm sie
selbst zusammensetzt, etwa um eine Datei in einen anderen Ordner zu legen, wird Text unbequem.
Pfade als Text
ordner = "downloads/"
name = "Rechnung 03.10.2026.pdf"
print(ordner + "/" + name)
print("downloads" + name)
print(name.split(".")[1]) Drei Versuche, drei Fehler, und keiner davon meldet sich. Einmal steht der Schrägstrich doppelt da,
weil er schon am Ordner hing. Einmal fehlt er ganz. Und wenn man die Endung über split(".") sucht,
kommt bei einer Rechnung mit Datum im Namen 10 statt pdf heraus. Die Punkte im Datum sind eben
auch Punkte.
Dazu kommt Windows. Dort trennt ein Backslash, downloads\Bilder. Python nimmt dort zwar auch den
gewöhnlichen Schrägstrich an. Wer Pfade selbst zusammenklebt, hat aber bald beide in einem Pfad
stehen, und ein Programm mit Backslashes im Code findet auf Linux und dem Mac gar nichts.
Path
from pathlib import Path
pfad = Path("downloads") / "Bilder" / "IMG_4711.JPG"
print(pfad)
print(Path("downloads/") / "Rechnung 03.10.2026.pdf")
print(type(pfad)) Im Modul pathlib steckt dafür Path, das du aus den Aufgaben schon kennst. Ein Path ist ein
eigener Typ und kein Text. Der Schrägstrich / zwischen zwei Teilen setzt sie zu einem Pfad
zusammen. Ob am Ordner schon einer hing, ist egal, doppelt steht er nie da.
Mit print siehst du den Pfad so, wie das System ihn schreibt, hier mit Schrägstrichen und unter
Windows mit Backslashes. Im Code schreibst du auf beiden Systemen /. Darum musst du dich also nie
wieder kümmern.
In der letzten Zeile steht der Typ PosixPath. So heißt ein Pfad auf Linux und dem Mac, auf Windows
steht dort WindowsPath. Für dich ist beides einfach ein Path. Und wo eine Funktion einen
Dateinamen erwartet, etwa open, geht ein Path genauso gut wie Text.
Die Teile eines Pfads
from pathlib import Path
rechnung = Path("downloads/Rechnung 03.10.2026.pdf")
print(rechnung.name)
print(rechnung.stem)
print(rechnung.suffix)
print(rechnung.parent)
foto = Path("downloads/IMG_4711.JPG")
print(foto.suffix, foto.suffix.lower())
print(repr(Path("downloads/LIESMICH").suffix)) Ein Path kennt seine Teile. .name ist der Dateiname samt Endung, .stem (Stamm) der Name ohne
Endung. .suffix ist die Endung mit Punkt, und zwar nur der Teil nach dem letzten Punkt, egal wie
viele davor stehen. .parent ist der Ordner, in dem die Datei liegt, wieder als Path.
Die Endung schreibt jeder, wie er will. Kameras gern .JPG, Menschen .jpg. Für einen Vergleich
bringt .suffix.lower() beides auf eine Schreibweise. Eine Datei ohne Punkt im Namen hat als Endung
einen leeren Text.
Nachsehen und anlegen
from pathlib import Path
ziel = Path("downloads") / "Bilder"
print(ziel.exists())
ziel.mkdir(parents=True, exist_ok=True)
print(ziel.exists(), ziel.is_dir(), ziel.is_file())
ziel.mkdir(parents=True, exist_ok=True)
print("Ein zweites Mal geht auch.") .exists() sagt, ob es den Pfad gibt, .is_dir() und .is_file(), ob er ein Ordner (directory)
oder eine Datei ist. .mkdir() legt einen Ordner an (make directory), und mit den zwei Angaben
dahinter wird es bequem.
parents=True legt fehlende Ordner auf dem Weg gleich mit an, hier downloads. Ohne die Angabe
endet der Aufruf mit einem FileNotFoundError. exist_ok=True heißt, dass es in Ordnung ist, wenn
es den Ordner schon gibt. Fehlt das, endet ein zweiter Aufruf mit
FileExistsError: [Errno 17] File exists: 'downloads/Bilder'. Ein Programm, das bei jedem Lauf
seine Ordner anlegt, liefe dann genau einmal.
Relativ zu was?
Zahnarzt am Dienstag
Fahrrad zur Inspektion from pathlib import Path
print("Arbeitsverzeichnis:", Path.cwd())
with open("notizen.txt", encoding="utf-8") as datei:
print(datei.read(), end="") Ein Pfad, der nicht mit / anfängt (unter Windows nicht mit einem Laufwerk wie C:), ist ein
relativer Pfad. Er gilt vom Arbeitsverzeichnis aus, also von dem Ordner, in dem das Programm
gestartet wurde. Nicht von dem Ordner, in dem die Datei liegt.
Das ist die häufigste Ursache für einen FileNotFoundError, und hier passiert es auch.
notizen_zeigen.py und notizen.txt liegen nebeneinander im Ordner werkzeuge. Gestartet wird
aber mit python werkzeuge/notizen_zeigen.py aus dem Ordner darüber, und dort gibt es keine
notizen.txt.
Zu Hause passiert das ständig. Beim Start aus Visual Studio Code, wenn dort ein anderer Ordner offen
ist, mit cron und in der Aufgabenplanung, wenn das Feld „Starten in“ leer bleibt. Am Programm hat
sich nichts geändert, nur an dem Ort, von dem aus es gestartet wird.
Zahnarzt am Dienstag
Fahrrad zur Inspektion from pathlib import Path
ordner = Path(__file__).parent
print("Diese Datei liegt in:", ordner)
with open(ordner / "notizen.txt", encoding="utf-8") as datei:
print(datei.read(), end="") __file__ ist ein Name, den Python in jeder Datei von selbst anlegt, mit dem Pfad dieser Datei.
Sein .parent ist der Ordner, in dem sie liegt. Von dort aus sind ihre Nachbarn immer zu finden,
egal von wo aus sie gestartet wurde.
Für ein Werkzeug, das seine Dateien neben sich liegen hat und zu Hause per Doppelklick oder zu festen Zeiten startet, ist das die sichere Form. In den Aufgaben hier liegt alles im Arbeitsverzeichnis, und deshalb reicht dort der kurze Name.
Was die Aufgabe will
Für einen Aufräumer in Lektion 11.7 braucht es zuerst eine Regel, wohin eine Datei gehört. Bilder
kommen in einen Ordner Bilder, Dokumente in Dokumente, und zwar dort, wo die Datei gerade liegt.
Für eine Liste von Pfaden wird ausgerechnet, wie der neue Pfad heißt. Verschoben wird noch nichts.
Zum Mitnehmen
Mit Path aus dem Modul pathlib setzt man Pfade aus Teilen zusammen, etwa Path("downloads") / "Bilder" / "a.jpg". Über .name, .stem, .suffix und .parent kommst du an die Teile, .exists() prüft, ob es den Pfad gibt, und .mkdir(parents=True, exist_ok=True) legt Ordner an. Ein Pfad ohne führenden Schrägstrich hängt am Arbeitsverzeichnis, die Nachbarn der eigenen Datei findet Path(__file__).parent.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 6 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.