HOWTO · Python
Relativer Pfad in Python
Der Artikel erklärt absolute und relative Dateipfade in Python, zeigt, wie das aktuelle Arbeitsverzeichnis als Basis die Auflösung relativer Pfade beeinflusst und wie sich Pfade ausgehend von einer ausdrücklich gewählten Basis zusammensetzen lassen.
Auf dieser Seite
Ein relativer Pfad wird von einem Basisverzeichnis aus interpretiert, üblicherweise vom aktuellen Arbeitsverzeichnis des Prozesses. Er bezeichnet nicht automatisch einen Pfad relativ zum Python-Skript. Verwenden Sie einen absoluten Pfad, wenn der Speicherort unabhängig von dieser Basis sein soll, oder erstellen Sie einen relativen Pfad ausgehend von einer selbst gewählten Basis.
Dateipfade in Python
Ein Dateipfad setzt sich aus Verzeichnisnamen und einem Dateinamen zusammen. Zum Beispiel bezeichnet C:\\PythonProjects\\Tutorials\\Paths\\paths.py ein Skript auf dem Laufwerk C:. Windows-Pfade werden üblicherweise mit umgekehrten Schrägstrichen (\\) dargestellt, macOS- und Linux-Pfade meist mit normalen Schrägstrichen (/). Diese Zeichen sind Trennzeichen im Dateisystem; in Python-Zeichenketten können umgekehrte Schrägstriche außerdem Escape-Sequenzen einleiten. Verwenden Sie für Windows-Pfade rohe Zeichenketten oder normale Schrägstriche, oder setzen Sie Pfade mit os.path.join() zusammen, damit Python das plattformspezifische Trennzeichen wählt.
Die Beispiele verwenden folgende Verzeichnisstruktur: Tutorials enthält die gleichrangigen Verzeichnisse Paths und Strings; paths.py liegt in Paths und string.py in Strings.
Unterschiede zwischen Windows, Mac und Linux
Ein angezeigter Windows-Pfad kann etwa so aussehen: C:\\PythonProjects\\Tutorials\\Paths\\paths.py. Ein POSIX-Pfad könnte dagegen /home/ava/Tutorials/Paths/paths.py lauten. Die Trennzeichen unterscheiden sich, aber Pythons Pfadfunktionen verarbeiten die jeweilige Plattformform. Eine als Python-Zeichenkette geschriebene Pfadangabe muss außerdem den Regeln für Zeichenkettenliterale entsprechen. Verwenden Sie daher vorzugsweise r"C:\\PythonProjects\\Tutorials", "C:/PythonProjects/Tutorials" oder übergeben Sie einzelne Komponenten an os.path.join().
Aktuelles Arbeitsverzeichnis
Das aktuelle Arbeitsverzeichnis (cwd) gehört zum laufenden Prozess und nicht zu einer bestimmten Datei. os.getcwd() gibt dieses Verzeichnis zurück. Ein relativer Pfad wie Strings/string.py wird ausgehend vom cwd aufgelöst; ändern Sie das cwd, wird derselbe relative Pfad anders interpretiert. os.chdir() ändert das cwd des gesamten Prozesses und kann sich dadurch auf anderen Prozesscode auswirken. Bei Skripten und Anwendungen lässt sich eine ausdrücklich angegebene Basis oft leichter nachvollziehen, als das cwd zu ändern.
Absoluter Pfad
Ein absoluter Pfad bezeichnet einen Speicherort ausgehend von der Wurzel des Dateisystems (oder unter Windows von einem Laufwerk). Für ein laufendes Skript liefert os.path.abspath(__file__) eine absolute Form des Skriptpfads, sofern __file__ verfügbar ist, wie es beim Ausführen einer Skriptdatei normalerweise der Fall ist. Das ist etwas anderes, als einen beliebigen relativen Pfad aufzulösen: Dieser wird üblicherweise ausgehend vom cwd des Prozesses interpretiert.
Wenn das cwd beispielsweise C:\\PythonProjects\\Tutorials lautet, lässt sich die Datei Strings\\string.py mit dem absoluten Pfad C:\\PythonProjects\\Tutorials\\Strings\\string.py angeben. Auf diesem Rechner ist ein absoluter Pfad eindeutig, muss aber häufig angepasst werden, wenn ein Projekt an einen anderen Speicherort verschoben wird.
Absoluten Pfad zu string.py in Python erstellen
Um einen absoluten Pfad zu erstellen, beginnen Sie bei der Wurzel des Dateisystems und fügen Sie die Verzeichnis- und Dateinamen zusammen. os.path.abspath() wandelt das Ergebnis in einen auf dem aktuellen Rechner absoluten Pfad um. Das Zusammensetzen eines Pfads erstellt die Datei nicht; das Beispiel prüft lediglich, ob der konstruierte Pfad absolut ist.
import os
root = os.path.abspath(os.sep)
absolute_path = os.path.abspath(
os.path.join(root, "Tutorials", "Strings", "string.py")
)
print(os.path.isabs(absolute_path))
True
Relativer Pfad
Ein relativer Pfad bezeichnet einen Speicherort ausgehend von einer festgelegten Basis. In alltäglichen Python-Programmen ist das häufig das aktuelle Arbeitsverzeichnis, aber das Programm kann auch ein anderes Verzeichnis als Basis wählen. Diese Basis muss eindeutig sein: Strings/string.py bezeichnet etwas anderes, wenn das cwd Tutorials statt Tutorials/Paths ist.
Lautet das cwd C:\\PythonProjects\\Tutorials, ist der Pfad zur Datei im benachbarten Verzeichnis Strings\\string.py. Lautet das cwd dagegen C:\\PythonProjects\\Tutorials\\Paths, erreichen Sie dieselbe Datei über ..\\Strings\\string.py; .. steht für das übergeordnete Verzeichnis. Mit os.path.join() lassen sich diese Komponenten ohne fest codiertes Trennzeichen zusammensetzen. Soll ein relativer Pfad stattdessen ausgehend vom Skriptverzeichnis aufgelöst werden, leiten Sie dieses Verzeichnis aus __file__ ab und verwenden Sie es als ausdrücklich angegebene Basis. So kann ein Programm Ressourcen neben seinem Code finden, unabhängig davon, aus welchem Verzeichnis es gestartet wurde.
Beginnen Sie beispielsweise beim Skriptverzeichnis, wechseln Sie in dessen übergeordnetes Verzeichnis (Tutorials) und fügen Sie dann Strings und string.py hinzu. So entsteht ein Pfad auf Grundlage des Skriptstandorts statt des Prozess-cwd. os.path.abspath() kann das Ergebnis in eine absolute Form umwandeln. Die Beispielstruktur setzt voraus, dass Paths und Strings gleichrangige Verzeichnisse sind; passen Sie die Komponenten an, wenn Ihre Projektstruktur anders aussieht.
Relativen Pfad von Paths nach Strings in Python erstellen
Um den Pfad von Tutorials/Paths zu Tutorials/Strings/string.py zu bestimmen, übergeben Sie beide Speicherorte an os.path.relpath(). Mit dem Argument start legen Sie Paths ausdrücklich als Basis fest. In dieser Verzeichnisstruktur lautet der resultierende relative Pfad daher ../Strings/string.py. Die Funktion berechnet aus den übergebenen Namen eine Pfadzeichenkette; sie ändert weder das Prozess-cwd noch prüft sie, ob das Ziel existiert, oder greift auf die Datei zu. Wird das Ergebnis ausgehend von einer anderen Basis aufgelöst, bezeichnet es einen anderen Speicherort.
Das Beispiel verwendet relative Namen für die gemeinsame Verzeichnisstruktur. os.path.relpath() vergleicht diese Namen lexikalisch. Daher müssen die Verzeichnisse und die Datei für diese Berechnung nicht existieren.
import os
paths = os.path.join("Tutorials", "Paths")
string_file = os.path.join("Tutorials", "Strings", "string.py")
relative_path = os.path.relpath(string_file, start=paths)
print(relative_path.replace(os.sep, "/"))
Zum Ändern des Prozess-cwd lesen Sie die Dokumentation zu os.chdir(). Informationen zum Ermitteln des Prozess-cwd finden Sie unter os.getcwd(). Für beide Ziele sind derzeit keine deutschsprachigen Seiten verfügbar; die Links führen deshalb zu den englischen Seiten.