Python Pathlib Modul

For a deep dive into practical file system operations, check out our blog post: 10 Essential File System Operations Every Developer Should Know.

Das pathlib-Modul wurde in Python 3.4 hinzugefügt und bietet eine objektorientierte Möglichkeit zur Handhabung von Dateisystempfaden.

Pathlib vs OS Modul

pathlib bietet weitaus mehr Funktionalität als die hier aufgeführten des os-Moduls, wie z. B. das Abrufen des Dateinamens, das Abrufen der Dateierweiterung, das Lesen/Schreiben einer Datei ohne manuelles Öffnen usw. Sehen Sie sich die offizielle Dokumentation an, wenn Sie mehr erfahren möchten.
Für einen detaillierteren Blick auf beide siehe die Seite File and directory Paths.

Linux- und Windows-Pfade

Unter Windows werden Pfade mit Backslashes (\) als Trennzeichen zwischen Ordnernamen geschrieben. Auf Unix-basierten Betriebssystemen wie macOS, Linux und BSDs wird der Schrägstrich (/) als Pfadtrennzeichen verwendet. Das Verknüpfen von Pfaden kann ein Problem sein, wenn Ihr Code auf verschiedenen Plattformen funktionieren muss.

Glücklicherweise bietet uns Python pathlib.Path.joinpath, um dies einfach zu handhaben.

from pathlib import Path

# Join path components
print(Path('usr').joinpath('bin').joinpath('spam'))
usr/bin/spam

pathlib bietet auch eine Abkürzung für joinpath mithilfe des /-Operators:

from pathlib import Path

# Use / operator to join paths
print(Path('usr') / 'bin' / 'spam')
usr/bin/spam

Das Verknüpfen von Pfaden ist hilfreich, wenn Sie verschiedene Dateipfade unter demselben Verzeichnis erstellen müssen.

my_files = ['accounts.txt', 'details.csv', 'invite.docx']
# Get user's home directory
home = Path.home()
# Join each filename with home directory
for filename in my_files:
    print(home / filename)
/home/labex/project/accounts.txt
/home/labex/project/details.csv
/home/labex/project/invite.docx

Das aktuelle Arbeitsverzeichnis

from pathlib import Path
from os import chdir

# Get current working directory
print(Path.cwd())
/home/labex/project
# Change directory using os module
chdir('/usr/lib/python3.10')
# Verify current directory
print(Path.cwd())
/usr/lib/python3.10

Neue Ordner erstellen

from pathlib import Path
cwd = Path.cwd()
# Create directory (will fail if parent directories don't exist)
(cwd / 'delicious' / 'walnut' / 'waffles').mkdir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.10/pathlib.py", line 1226, in mkdir
    self._accessor.mkdir(self, mode)
  File "/usr/lib/python3.10/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
FileNotFoundError: [Errno 2] No such file or directory: '/home/labex/project/delicious/walnut/waffles'

Der Grund für diesen Fehler ist, dass das Verzeichnis ‘delicious’ nicht existiert, sodass wir die Verzeichnisse ‘walnut’ und ‘waffles’ nicht darunter erstellen können. Um dies zu beheben, tun Sie Folgendes:

from pathlib import Path
cwd = Path.cwd()
# Create directory with all parent directories
(cwd / 'delicious' / 'walnut' / 'waffles').mkdir(parents=True)

Absolute vs. Relative Pfade

Es gibt zwei Möglichkeiten, einen Dateipfad anzugeben.

  • Ein absoluter Pfad, der immer mit dem Stammordner beginnt
  • Ein relativer Pfad, der relativ zum aktuellen Arbeitsverzeichnis des Programms ist

Es gibt auch die Punkte (.) und Punkt-Punkt (..) Ordner. Dies sind keine echten Ordner, sondern spezielle Namen, die in einem Pfad verwendet werden können. Ein einzelner Punkt („Punkt“) für einen Ordnernamen ist eine Kurzform für „dieses Verzeichnis“. Zwei Punkte („Punkt-Punkt“) bedeuten „das übergeordnete Verzeichnis“.

Umgang mit absoluten Pfaden

Um zu sehen, ob ein Pfad ein absoluter Pfad ist:

from pathlib import Path
# Check if path is absolute
Path('/').is_absolute()
True
# Relative paths return False
Path('..').is_absolute()
False

Sie können auch einen absoluten Pfad extrahieren:

from pathlib import Path
# Get current directory
print(Path.cwd())
/home/labex/project
# Resolve relative path to absolute path
print(Path('..').resolve())
/home

Umgang mit relativen Pfaden

Sie können einen relativen Pfad von einem Startpfad zu einem anderen Pfad erhalten.

from pathlib import Path
# Get relative path from base path
print(Path('/etc/passwd').relative_to('/'))
etc/passwd

Pfad- und Dateigültigkeit

Überprüfen, ob eine Datei/ein Verzeichnis existiert

from pathlib import Path

# Check if path exists
Path('.').exists()
True
Path('setup.py').exists()
True
Path('/etc').exists()
True
Path('nonexistentfile').exists()
False

Überprüfen, ob ein Pfad eine Datei ist

from pathlib import Path

# Check if path is a file
Path('setup.py').is_file()
True
Path('/home').is_file()
False
Path('nonexistentfile').is_file()
False

Überprüfen, ob ein Pfad ein Verzeichnis ist

from pathlib import Path

# Check if path is a directory
Path('/').is_dir()
True
Path('setup.py').is_dir()
False
Path('/spam').is_dir()
False

Die Größe einer Datei in Bytes abrufen

from pathlib import Path

# Get file statistics
stat = Path('/bin/python3.10').stat()
print(stat) # stat contains some other information about the file as well
os.stat_result(st_mode=33261, st_ino=141087, st_dev=2051, st_nlink=2, st_uid=0,
--snip--
st_gid=0, st_size=10024, st_atime=1517725562, st_mtime=1515119809, st_ctime=1517261276)
# Access file size from stat object
print(stat.st_size) # size in bytes
10024

Verzeichnisse auflisten

from pathlib import Path

# Iterate through directory contents
for f in Path('/usr/bin').iterdir():
    print(f)
...
/usr/bin/tiff2rgba
/usr/bin/iconv
/usr/bin/ldd
/usr/bin/cache_restore
/usr/bin/udiskie
/usr/bin/unix2dos
/usr/bin/t1reencode
/usr/bin/epstopdf
/usr/bin/idle3
...

Dateigrößen von Verzeichnissen

WARNUNG

Verzeichnisse selbst haben auch eine Größe! Sie sollten also mit den Methoden aus den oben genannten Abschnitten überprüfen, ob ein Pfad eine Datei oder ein Verzeichnis ist.

from pathlib import Path

# Calculate total size of all files in directory
total_size = 0
for sub_path in Path('/usr/bin').iterdir():
    total_size += sub_path.stat().st_size
print(total_size)
1903178911

Dateien und Ordner löschen

  • Der Aufruf von Path.unlink() löscht die Datei am Pfad.

  • Der Aufruf von Path.rmdir() löscht den Ordner am Pfad. Dieser Ordner muss leer von Dateien oder Ordnern sein.

Morty Proxy This is a proxified and sanitized view of the page, visit original site.