Auf Wiedersehen os.path – Willkommen Pathlib

pathlib ist definitiv eine der größeren, neueren Ergänzungen der Standardbibliothek von Python. Sie ist seit Python 3.4 Teil der Standardbibliothek, aber viele Leute benutzen immer noch das os-Modul für Dateisystemoperationen.

pathlib hat jedoch viele Vorteile gegenüber dem alten os.path – während das os-Modul Pfade in einem rohen String-Format darstellt, verwendet pathlib einen objektorientierten Stil, was es lesbarer und natürlicher macht, es zu schreiben:

from pathlib import Path
import os.path

# alt, unlesbar
two_dirs_up = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# neu, lesbar
two_dirs_up = Path(__file__).resolve().parent.parent

Die Tatsache, dass Pfade als Objekte und nicht als Zeichenketten behandelt werden, macht es auch möglich, das Objekt einmal zu erstellen und dann seine Attribute nachzuschlagen oder Operationen mit ihm durchzuführen:

readme = Path("README.md").resolve()
print(f"Absolute path: {readme.absolute()}")
print(f"File name: {readme.name}")
print(f"Path root: {readme.root}")
print(f"Parent directory: {readme.parent}")
print(f"File extension: {readme.suffix}")
print(f"Is it absolute: {readme.is_absolute()}")

Ausgabe:

Absolute path: /home/jereczet/some/path/README.md
File name: README.md
Path root: /
Parent directory: /home/jereczet/some/path
File extension: .md
Is it absolute: True

Die Funktion von pathlib, die den größten Vorteil bietet, ist die Möglichkeit, den Operator / („Division“) zu verwenden, um Pfade zu verbinden. Bei dieser Zusammensetzung mus nur ein Teil ein Path-Objekt sein, alle weiteren Anteile können einfache Strings sein:

etc = Path('/etc')
joined = etc / "cron.d" / "anacron"
print(f"Exists? - {joined.exists()}")

Ausgabe:

Exists? - True

Dies macht die Handhabung von Pfaden so einfach.

In diesem Zusammenhang ist es wichtig zu beachten, dass pathlib nur ein Ersatz für os.path ist und kein ganzes os-Modul. Es enthält jedoch auch Funktionen des glob-Moduls. Wenn man also daran gewöhnt ist, os.path in Kombination mit glob.glob zu verwenden, dann kann man einfach vergessen, dass diese beiden existieren.

In den obigen Schnipseln haben wir einige praktische Pfadmanipulationen und Objektattribute vorgestellt, aber pathlib enthält auch alle Methoden, die man von os.path gewohnt ist, wie z.B.:

print(f"Working directory: {Path.cwd()}")          # entspricht os.getcwd()
Path.mkdir(Path.cwd() / "new_dir", exist_ok=True)  # entspricht os.makedirs()
print(Path("README.md").resolve())                 # entspricht os.path.abspath()
print(Path.home())                                 # same as os.path.expanduser()

Ausgabe:

Working directory: /home/dummy/some/path
/home/dummy/some/path/README.md
/home/dummy

Die vollständige Zuordnung der os.path-Funktionen zu den neuen Funktionen in pathlib findet man in der Dokumentation.
Weitere Beispiele dafür, wie großartig pathlib ist, findet man in einem ausführlichen Artikel (engl.) von Trey Hunner.