Ein umfassender Leitfaden zur Verwendung von pathlib in Python für die Manipulation des Dateisystems
Entdecke die Vorteile von Python pathlib gegenüber dem os-Modul, indem du Pfadobjekte, Pfadkomponenten und gängige Pfadoperationen für die Interaktion mit dem Dateisystem kennenlernst.
Bis vor kurzem war die Manipulation des Dateisystems in Python bekanntermaßen schwierig. Entwickler hatten oft mit falschen Dateipfaden zu kämpfen, die fehleranfällig waren, weil sie lange Zeichenketten als Eingabe benötigten. Außerdem berichteten die Entwickler, dass ihr Code aufgrund von Inkonsistenzen zwischen verschiedenen Betriebssystemen häufig nicht funktioniert.
Glücklicherweise haben die Entwickler von Python in Version 3.4 das Modul pathlib in die Standardbibliothek aufgenommen. pathlib bietet eine elegante Lösung für die Handhabung von Dateisystempfaden mit einem lang erwarteten objektorientierten Ansatz und gewährleistet zudem ein plattformunabhängiges Verhalten.
In diesem umfassenden Lernprogramm lernst du die Funktionen des Moduls pathlib kennen, die dich bei deiner täglichen Arbeit mit deinem Dateisystem unterstützen. Mit pathlib profitierst du von effizienten Arbeitsabläufen und einem einfachen Datenabruf. pathlib hat sich im Laufe der Jahre erheblich weiterentwickelt, und wir sind immer auf dem neuesten Stand, damit du das nicht tun musst. Lass uns loslegen.
Python os Module vs. pathlib
Vor Python 3.4 wurden Dateipfade traditionell mit dem Modul os behandelt. Während das Modul os einst sehr effektiv war, ist es mittlerweile in die Jahre gekommen.
Wir können den einzigartigen Wert von pathlib zeigen, indem wir eine häufige Aufgabe in der Datenwissenschaft betrachten: Wie findet man alle png Dateien innerhalb eines bestimmten Verzeichnisses und all seiner Unterverzeichnisse?
Wenn wir das Modul os verwenden würden, könnten wir den folgenden Code schreiben:
import os
dir_path ="/home/user/documents"
files =[
os.path.join(dir_path, f)for f in os.listdir(dir_path)if os.path.isfile(os.path.join(dir_path, f)) and f.endswith(".png")]Bereitgestellt von
Obwohl dieser Code die unmittelbare Aufgabe löst, unsere png Dateien zu finden, offenbart er einige große Nachteile des os Moduls. Zum einen ist der Code lang und fast unlesbar, was schade ist, wenn man bedenkt, dass es sich um einen relativ einfachen Vorgang handelt. Ein zweiter Punkt ist, dass unser Code die Kenntnis von List Comprehensions voraussetzt, was nicht als selbstverständlich vorausgesetzt werden sollte. Ein dritter Punkt ist, dass der Code String-Operationen beinhaltet, die fehleranfällig sind. Und obendrein ist der Code nicht sehr prägnant.
Wenn wir stattdessen das Modul pathlib verwenden würden, wäre unser Code viel einfacher. Wie wir bereits erwähnt haben, bietet pathlib einen objektorientierten Ansatz für den Umgang mit Dateisystempfaden. Sieh es dir an:
from pathlib import Path
# Create a path object
dir_path = Path(dir_path)# Find all text files inside a directory
files =list(dir_path.glob("*.png"))Bereitgestellt von
Diese objektorientierte Programmierung organisiert den Code rund um Objekte und ihre Interaktionen, was zu einem modulareren, wiederverwendbaren und wartbaren Code führt. Wenn du mit objektorientierter Programmierung nicht vertraut bist, lohnt es sich, sie in unseremKursObjektorientierte Python-Programmierung zu lernen.
Arbeiten mit Pfadobjekten in Python
Die Bibliothek pathlib basiert auf sogenannten Path Objekten, die Dateisystempfade auf strukturierte und plattformunabhängige Weise darstellen.
Zu Beginn dieses Lehrgangs haben wir die Klasse Path aus dem Modul pathlib mit der folgenden Codezeile in unseren aktuellen Namespace gebracht:
Nachdem wir die Klasse Path von pathlib aus aufgerufen haben, können wir Path Objekte auf verschiedene Arten erstellen, z. B. aus Strings, aus anderen Path Objekten, aus dem aktuellen Arbeitsverzeichnis und aus dem Home-Verzeichnis.
Schauen wir sie uns nacheinander an.
Pfadobjekte aus Strings erstellen
Wir können ein Path Objekt erstellen, indem wir einen String, der einen Dateisystempfad darstellt, an eine Variable übergeben. Dies wandelt die String-Repräsentation des Dateipfads in ein Path Objekt um.
file_path_str ="data/union_data.csv"
data_path = Path(file_path_str)Bereitgestellt von
Pfadobjekte aus anderen Pfadobjekten erstellen
Vorhandene Path Objekte können als Bausteine für die Erstellung neuer Pfade dienen.
Dazu kombinieren wir einen Basispfad, ein Datenverzeichnis und einen Dateinamen zu einem einzigen Dateipfad. Wir müssen daran denken, einen Schrägstrich zu verwenden, um unsere Path Objekte zu erweitern.
Pfadobjekte aus dem aktuellen Arbeitsverzeichnis erstellen
Hier weisen wir der Variablen cwd mit der Methode Path.cwd() das aktuelle Arbeitsverzeichnis zu. Wir können dann den Pfad des aktuellen Arbeitsverzeichnisses abfragen, in dem unser Skript läuft.
Pfadobjekte aus dem Hauptarbeitsverzeichnis erstellen
Wir können einen Pfad konstruieren, indem wir unser Heimatverzeichnis mit weiteren Unterverzeichnissen kombinieren. Hier kombinieren wir unser Home-Verzeichnis mit den Unterverzeichnissen "Downloads" und "Projekte".
Ein wichtiger Hinweis: Die Klasse Path selbst führt keine Dateisystemoperationen durch, wie z. B. die Überprüfung von Pfaden, das Erstellen von Verzeichnissen oder Dateien. Sie wurde entwickelt, um Pfade darzustellen und zu manipulieren. Um tatsächlich mit dem Dateisystem zu interagieren (Existenz prüfen, Dateien lesen/schreiben), müssen wir spezielle Methoden der Path Objekte verwenden und für einige fortgeschrittene Fälle Hilfe vom os Modul erhalten.
Arbeiten mit Pfadkomponenten in Python
Dateipfadattribute sind verschiedene Eigenschaften und Komponenten eines Dateipfads, die bei der Identifizierung und Verwaltung von Dateien und Verzeichnissen in einem Dateisystem helfen. Genauso wie eine physische Adresse aus verschiedenen Teilen besteht, z. B. Straßennummer, Stadt, Land und Postleitzahl, kann ein Dateisystempfad in kleinere Komponenten unterteilt werden. pathlib ermöglicht es uns, auf diese Komponenten zuzugreifen und sie mit Hilfe von Pfadattributen in Punktnotation zu bearbeiten.
Arbeiten mit dem Stammverzeichnis
Die Wurzel ist das oberste Verzeichnis in einem Dateisystem. In Unix-ähnlichen Systemen wird es durch einen Schrägstrich (/) dargestellt. In Windows ist es normalerweise ein Laufwerksbuchstabe, gefolgt von einem Doppelpunkt, wie C:.
image_file = home /"downloads"/"midjourney.png"
image_file.rootBereitgestellt von
Das Elternteil enthält die aktuelle Datei oder das aktuelle Verzeichnis. Es ist eine Ebene höher relativ zum aktuellen Verzeichnis oder zur aktuellen Datei.
Der Stamm gibt den Dateinamen ohne die Erweiterung zurück. Die Arbeit mit dem Stamm kann beim Konvertieren von Dateien in verschiedene Formate nützlich sein.
Hinweis: Auf einem Mac wird bei den Dateipfaden zwischen Groß- und Kleinschreibung unterschieden, so dass /Users/username/Documents und /users/username/documents anders aussehen würden.
Das Attribut pathlib parts
Wir können das Attribut .parts verwenden, um ein Path Objekt in seine Komponenten zu zerlegen.
[PosixPath('/home/bexgboost/downloads'),
PosixPath('/home/bexgboost'),
PosixPath('/home'),
PosixPath('/')]Bereitgestellt von
Gemeinsame Pfadoperationen mit pathlib
Path Objekte haben viele Methoden, mit denen du effizient mit Verzeichnissen und ihren Inhalten arbeiten kannst. Schauen wir uns an, wie man einige der häufigsten Vorgänge durchführt.
Verzeichnis der Verzeichnisse
Mit der Methode iterdir() kannst du alle Dateien und Unterverzeichnisse in einem Ordner durchsuchen. Sie ist besonders nützlich, um alle Dateien in einem Verzeichnis zu bearbeiten oder Operationen an jedem einzelnen Eintrag durchzuführen.
Da Path Objekte nur Pfade darstellen, musst du manchmal mit der Methode .exists() überprüfen, ob ein Pfad existiert:
Die Methode .exists() prüft, ob ein Pfad existiert. Das ist nützlich, weil Path Objekte Dateien und Verzeichnisse repräsentieren können, die im Dateisystem vorhanden sein können oder auch nicht.
pathlib bietet auch Funktionen zum Erstellen und Löschen von Dateien und Verzeichnissen. Lass uns sehen, wie.
Die Methode mkdir()
Die Methode mkdir() erstellt ein neues Verzeichnis unter dem angegebenen Pfad. Standardmäßig wird das Verzeichnis im aktuellen Arbeitsverzeichnis erstellt.
from pathlib import Path
data_dir = Path("new_data_dir")# Create the directory 'new_data_dir' in the current working directory
data_dir.mkdir()Bereitgestellt von
Die Methode mkdir(parents=True)
Die Methode mkdir(parents=True) ist besonders nützlich, wenn du eine Verzeichnisstruktur erstellen willst, in der einige übergeordnete Verzeichnisse nicht existieren. Die Einstellung parents=True stellt sicher, dass alle notwendigen übergeordneten Verzeichnisse auf dem Weg erstellt werden.
sub_dir = Path("data/nested/subdirectory")# Create 'data/nested/subdirectory', even if 'data' or 'nested' don't exist
sub_dir.mkdir(parents=True)Bereitgestellt von
Beachte, dass mkdir() eine Ausnahme auslöst, wenn bereits ein Verzeichnis mit demselben Namen existiert.
Die Methode unlink() löscht eine Datei, die durch das Objekt Path repräsentiert wird, dauerhaft. Es wird empfohlen, vor dem Ausführen dieser Methode zu prüfen, ob eine Datei vorhanden ist, um eine Fehlermeldung zu vermeiden.
to_delete = Path("data/prices.csv")if to_delete.exists():
to_delete.unlink()print(f"Successfully deleted {to_delete.name}")Bereitgestellt von
Die Methode rmdir() löscht ein leeres Verzeichnis. Denke daran, dass rmdir() nur leere Verzeichnisse entfernen kann. Der einfachste Weg, ein nicht leeres Verzeichnis zu löschen, ist die Verwendung der shutil-Bibliothek oder des Terminals.
Hinweis: Sei bitte vorsichtig, wenn du unlink() oder rmdir() benutzt, denn die Ergebnisse sind dauerhaft.
Erweiterte Pfadmanipulation
Kommen wir nun zu einigen fortgeschrittenen Konzepten der Pfadmanipulation und wie man sie in der Praxis mit pathlib anwendet.
Relative vs. absolute Pfade
Wir fangen damit an, die Unterschiede zwischen absoluten und relativen Pfaden zu verstehen, da sie oft vorkommen.
Relative Pfade
Relative Pfade geben den Ort einer Datei oder eines Verzeichnisses relativ zum aktuellen Verzeichnis an, daher das Wort relativ. Sie sind kurz und flexibel innerhalb deines Projekts, können aber verwirrend sein, wenn du das Arbeitsverzeichnis wechselst.
Ich habe zum Beispiel einen Bilderordner in meinem aktuellen Arbeitsverzeichnis, der die Datei midjourney.png enthält.
Der obige Code funktioniert jetzt, aber wenn ich das Notebook, das ich benutze, an einen anderen Ort verschiebe, bricht das Snippet ab, weil der Bilderordner nicht mit dem Notebook verschoben wurde.
Absolute Pfade
Absolute Pfade geben den vollständigen Speicherort einer Datei oder eines Verzeichnisses vom Stamm des Dateisystems aus an. Sie sind unabhängig vom aktuellen Verzeichnis und bieten einen eindeutigen Bezugspunkt für jeden Benutzer überall im System.
image_absolute = Path("/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png")
image_absoluteBereitgestellt von
PosixPath('/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png')Bereitgestellt von
Wie du siehst, können absolute Pfade ziemlich lang sein, besonders in komplexen Projekten mit verschachtelten Baumstrukturen. Aus diesem Grund bevorzugen die meisten Menschen relative Pfade, die kürzer sind.
Methode auflösen
pathlib bietet Methoden, um relative Pfade mit der Methode resolve() in absolute umzuwandeln.
relative_image = Path("images/midjourney.png")
absolute_image = relative_image.resolve()
absolute_imageBereitgestellt von
PosixPath('/home/bexgboost/articles/2024/4_april/8_pathlib/images/midjourney.png')Bereitgestellt von
Wir können auch den umgekehrten Weg gehen: Wenn wir einen absoluten Pfad haben, können wir ihn in einen relativen Pfad umwandeln, der auf einem Referenzverzeichnis basiert.
relative_path = Path.cwd()
absolute_image.relative_to(relative_path)Bereitgestellt von
Um das Globbing zu veranschaulichen, können wir zu dem Beispiel zurückkehren, das wir zu Beginn des Artikels vorgestellt haben. Dort haben wir einen Code geschrieben, um alle png Dateien in einem bestimmten Verzeichnis zu finden.
pathlib verwendet das eingebaute Modul .glob(), um in einem beliebigen Verzeichnis effizient nach Dateien zu suchen, die einem bestimmten Muster entsprechen. Dieses Modul ist sehr nützlich, wenn Dateien mit ähnlichen Namen oder Erweiterungen verarbeitet werden sollen.
Die glob-Methode akzeptiert eine Zeichenkette mit Platzhaltern als Eingabe und gibt ein Generatorobjekt zurück, das bei Bedarf passende Path Objekte liefert:
*: Passt auf null oder mehr Zeichen.
?: Passt auf jedes einzelne Zeichen.
[]: Entspricht einem Bereich von Zeichen, die in Klammern eingeschlossen sind (z. B. [a-z] entspricht einem beliebigen Kleinbuchstaben).
Zur Veranschaulichung wollen wir versuchen, alle Jupyter-Notizbücher in meinem Artikelverzeichnis zu finden.
articles_dir = Path.home()/"articles"# Find all scripts
notebooks = articles_dir.glob("*.ipynb")# Print how many foundprint(len(list(notebooks)))Bereitgestellt von
Die Methode .glob() hat keine Notizbücher gefunden, was auf den ersten Blick überraschend erscheint, weil ich über 150 Artikel geschrieben habe. Der Grund dafür ist, dass .glob() nur innerhalb des angegebenen Verzeichnisses sucht, nicht in dessen Unterverzeichnissen.
Wir können dieses Problem durch eine rekursive Suche lösen, für die wir die Methode rglob() verwenden müssen, die eine ähnliche Syntax hat:
notebooks = articles_dir.rglob("*.ipynb")print(len(list(notebooks)))Bereitgestellt von
Dieses Mal hat unser Code alle 357 Dateien gefunden.
Arbeiten mit Dateien
Wie wir gesehen haben, repräsentieren Path Objekte nur Dateien, führen aber keine Operationen mit ihnen durch. Sie verfügen jedoch über bestimmte Methoden für gängige Dateioperationen. Wir werden in diesem Abschnitt sehen, wie man sie benutzt.
Dateien lesen
Das Lesen von Dateiinhalten ist ein grundlegender Vorgang in vielen Python-Anwendungen. pathlib bietet bequeme Kurzbefehle, um Dateien entweder als Text oder als Rohbytes zu lesen.
Mit der Methode read_text() können wir den Inhalt einer Textdatei lesen und die Datei schließen.
Wie wir sehen können, überschreibt die Methode write_text() den Text. Obwohl es für write_text() keinen Anfügemodus gibt, können wir read_text() und write_text() zusammen verwenden, um Text an das Ende der Datei anzuhängen.
old_text =file.read_text()+"\n"
final_text ="This is the final text."# Combine old and new texts and write them backfile.write_text(old_text + final_text)print(file.read_text())Bereitgestellt von
Die Methode with_stem() gibt einen Dateipfad mit einem anderen Dateinamen zurück (obwohl das Suffix dasselbe bleibt). So können wir ein Originalbild lesen und seinen Kontext in ein neues Bild schreiben.
Zusätzlich zur Funktion with_stem(), mit der du den Stamm einer Datei umbenennen kannst, bietet pathlib die Methode rename(), mit der du die Datei noch vollständiger umbenennen kannst.
file= Path("file.txt")
target_path = Path("new_file.txt")file.rename(target_path)Bereitgestellt von
rename() akzeptiert einen Zielpfad, der ein String oder ein anderes Pfadobjekt sein kann.
Um Dateien zu verschieben, kannst du die Funktion replace() verwenden, die auch einen Zielpfad akzeptiert:
# Define the file to be moved
source_file = Path("new_file.txt")# Define the location to put the file
destination = Path("data/new/location")# Create the directories if they don't exist
destination.mkdir(parents=True)# Move the file
source_file.replace(destination / source_file.name)Bereitgestellt von
Die Methode touch ist ursprünglich dafür gedacht, die Änderungszeit einer Datei zu aktualisieren, sie kann also auch für bestehende Dateien verwendet werden.
Wenn du einen Dateinamen für eine spätere Verwendung reservieren musst, aber im Moment keinen Inhalt hast, den du hineinschreiben kannst, können wir mit touch einen Rohling erstellen. Die Methode wurde vom Unix-Terminalbefehl touch inspiriert.
Berechtigungen und Dateisysteminformationen
Als letzten Punkt lernen wir, wie man mit der Methode .stat() auf Dateieigenschaften zugreift. Wenn du mit os vertraut bist, wirst du feststellen, dass diese neue Methode die gleiche Ausgabe wie os.stat() hat.
Die Einführung des Moduls pathlib in Python 3.4 hat die Manipulation des Dateisystems für Entwickler erheblich vereinfacht. Durch einen objektorientierten Ansatz für die Behandlung von Dateipfaden bietet pathlib eine strukturierte und einfache Möglichkeit, Dateisystempfade darzustellen. pathlib ist außerdem plattformunabhängig, d.h. pathlib behandelt Pfadseparatoren auf verschiedenen Betriebssystemen einheitlich, sodass unser Code auf einem neuen Rechner nicht kaputt geht. Wie wir gesehen haben, bietet pathlib eine große Anzahl von prägnanten und ausdrucksstarken Methoden für gängige Dateisystemoperationen.
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Lerne mehr über abstrakte Klassen in Python, wozu sie gut sind und wie du mit dem Modul „abc“ einheitliche Schnittstellen sicherstellen kannst. Enthält praktische Beispiele und bewährte Methoden für eine effektive Umsetzung.
Lerne, wie du Python-Listen mit Techniken wie Slicing, List Comprehensions und itertools aufteilen kannst. Finde heraus, wann du welche Methode für die beste Datenverarbeitung nutzen solltest.
Erforsche Pythons match-case: eine Anleitung zu seiner Syntax, Anwendungen in Data Science und ML sowie eine vergleichende Analyse mit dem traditionellen switch-case.
Lerne mehr über Python-Lambda-Funktionen, wozu sie gut sind und wann man sie benutzt. Enthält praktische Beispiele und bewährte Methoden für eine effektive Umsetzung.
Verbessere deine Programmierkenntnisse. Lerne, wie du Code optimierst, Funktionen und Tests schreibst und Best-Practice-Techniken der Softwareentwicklung anwendest.
Bis vor kurzem war die Manipulation des Dateisystems in Python bekanntermaßen schwierig. Entwickler hatten oft mit falschen Dateipfaden zu kämpfen, die fehleranfällig waren, weil sie lange Zeichenketten als Eingabe benötigten. Außerdem berichteten die Entwickler, dass ihr Code aufgrund von Inkonsistenzen zwischen verschiedenen Betriebssystemen häufig nicht funktioniert.
Glücklicherweise haben die Entwickler von Python in Version 3.4 das Modul
pathlibin die Standardbibliothek aufgenommen.pathlibbietet eine elegante Lösung für die Handhabung von Dateisystempfaden mit einem lang erwarteten objektorientierten Ansatz und gewährleistet zudem ein plattformunabhängiges Verhalten.In diesem umfassenden Lernprogramm lernst du die Funktionen des Moduls
pathlibkennen, die dich bei deiner täglichen Arbeit mit deinem Dateisystem unterstützen. Mitpathlibprofitierst du von effizienten Arbeitsabläufen und einem einfachen Datenabruf.pathlibhat sich im Laufe der Jahre erheblich weiterentwickelt, und wir sind immer auf dem neuesten Stand, damit du das nicht tun musst. Lass uns loslegen.Python os Module vs. pathlib
Vor Python 3.4 wurden Dateipfade traditionell mit dem Modul
osbehandelt. Während das Moduloseinst sehr effektiv war, ist es mittlerweile in die Jahre gekommen.Wir können den einzigartigen Wert von
pathlibzeigen, indem wir eine häufige Aufgabe in der Datenwissenschaft betrachten: Wie findet man allepngDateien innerhalb eines bestimmten Verzeichnisses und all seiner Unterverzeichnisse?Wenn wir das Modul
osverwenden würden, könnten wir den folgenden Code schreiben:Obwohl dieser Code die unmittelbare Aufgabe löst, unsere
pngDateien zu finden, offenbart er einige große Nachteile desosModuls. Zum einen ist der Code lang und fast unlesbar, was schade ist, wenn man bedenkt, dass es sich um einen relativ einfachen Vorgang handelt. Ein zweiter Punkt ist, dass unser Code die Kenntnis von List Comprehensions voraussetzt, was nicht als selbstverständlich vorausgesetzt werden sollte. Ein dritter Punkt ist, dass der Code String-Operationen beinhaltet, die fehleranfällig sind. Und obendrein ist der Code nicht sehr prägnant.Wenn wir stattdessen das Modul pathlib verwenden würden, wäre unser Code viel einfacher. Wie wir bereits erwähnt haben, bietet
pathlibeinen objektorientierten Ansatz für den Umgang mit Dateisystempfaden. Sieh es dir an:Diese objektorientierte Programmierung organisiert den Code rund um Objekte und ihre Interaktionen, was zu einem modulareren, wiederverwendbaren und wartbaren Code führt. Wenn du mit objektorientierter Programmierung nicht vertraut bist, lohnt es sich, sie in unseremKurs Objektorientierte Python-Programmierung zu lernen.
Arbeiten mit Pfadobjekten in Python
Die Bibliothek
pathlibbasiert auf sogenanntenPathObjekten, die Dateisystempfade auf strukturierte und plattformunabhängige Weise darstellen.Zu Beginn dieses Lehrgangs haben wir die Klasse
Pathaus dem Modulpathlibmit der folgenden Codezeile in unseren aktuellen Namespace gebracht:Nachdem wir die Klasse
Pathvonpathlibaus aufgerufen haben, können wirPathObjekte auf verschiedene Arten erstellen, z. B. aus Strings, aus anderenPathObjekten, aus dem aktuellen Arbeitsverzeichnis und aus dem Home-Verzeichnis.Schauen wir sie uns nacheinander an.
Pfadobjekte aus Strings erstellen
Wir können ein
PathObjekt erstellen, indem wir einen String, der einen Dateisystempfad darstellt, an eine Variable übergeben. Dies wandelt die String-Repräsentation des Dateipfads in einPathObjekt um.Pfadobjekte aus anderen Pfadobjekten erstellen
Vorhandene
PathObjekte können als Bausteine für die Erstellung neuer Pfade dienen.Dazu kombinieren wir einen Basispfad, ein Datenverzeichnis und einen Dateinamen zu einem einzigen Dateipfad. Wir müssen daran denken, einen Schrägstrich zu verwenden, um unsere
PathObjekte zu erweitern.Pfadobjekte aus dem aktuellen Arbeitsverzeichnis erstellen
Hier weisen wir der Variablen
cwdmit der MethodePath.cwd()das aktuelle Arbeitsverzeichnis zu. Wir können dann den Pfad des aktuellen Arbeitsverzeichnisses abfragen, in dem unser Skript läuft.Pfadobjekte aus dem Hauptarbeitsverzeichnis erstellen
Wir können einen Pfad konstruieren, indem wir unser Heimatverzeichnis mit weiteren Unterverzeichnissen kombinieren. Hier kombinieren wir unser Home-Verzeichnis mit den Unterverzeichnissen "Downloads" und "Projekte".
Ein wichtiger Hinweis: Die Klasse
Pathselbst führt keine Dateisystemoperationen durch, wie z. B. die Überprüfung von Pfaden, das Erstellen von Verzeichnissen oder Dateien. Sie wurde entwickelt, um Pfade darzustellen und zu manipulieren. Um tatsächlich mit dem Dateisystem zu interagieren (Existenz prüfen, Dateien lesen/schreiben), müssen wir spezielle Methoden derPathObjekte verwenden und für einige fortgeschrittene Fälle Hilfe vomosModul erhalten.Arbeiten mit Pfadkomponenten in Python
Dateipfadattribute sind verschiedene Eigenschaften und Komponenten eines Dateipfads, die bei der Identifizierung und Verwaltung von Dateien und Verzeichnissen in einem Dateisystem helfen. Genauso wie eine physische Adresse aus verschiedenen Teilen besteht, z. B. Straßennummer, Stadt, Land und Postleitzahl, kann ein Dateisystempfad in kleinere Komponenten unterteilt werden.
pathlibermöglicht es uns, auf diese Komponenten zuzugreifen und sie mit Hilfe von Pfadattributen in Punktnotation zu bearbeiten.Arbeiten mit dem Stammverzeichnis
Die Wurzel ist das oberste Verzeichnis in einem Dateisystem. In Unix-ähnlichen Systemen wird es durch einen Schrägstrich (
/) dargestellt. In Windows ist es normalerweise ein Laufwerksbuchstabe, gefolgt von einem Doppelpunkt, wieC:.Arbeiten mit dem übergeordneten Verzeichnis
Das Elternteil enthält die aktuelle Datei oder das aktuelle Verzeichnis. Es ist eine Ebene höher relativ zum aktuellen Verzeichnis oder zur aktuellen Datei.
Arbeiten mit dem Dateinamen
Dieses Attribut gibt den gesamten Dateinamen, einschließlich der Erweiterung, als String zurück.
Arbeiten mit dem Dateisuffix
Das Suffix-Attribut gibt die Dateierweiterung einschließlich des Punktes als String zurück (oder einen leeren String, wenn es keine Erweiterung gibt).
Arbeiten mit dem Feilenstamm
Der Stamm gibt den Dateinamen ohne die Erweiterung zurück. Die Arbeit mit dem Stamm kann beim Konvertieren von Dateien in verschiedene Formate nützlich sein.
Hinweis: Auf einem Mac wird bei den Dateipfaden zwischen Groß- und Kleinschreibung unterschieden, so dass
/Users/username/Documentsund/users/username/documentsanders aussehen würden.Das Attribut pathlib parts
Wir können das Attribut
.partsverwenden, um einPathObjekt in seine Komponenten zu zerlegen.Das Attribut pathlib parents
Das Attribut
parents, das einen Generator liefert, verwandelt diese Komponenten inPathObjekte.Gemeinsame Pfadoperationen mit pathlib
PathObjekte haben viele Methoden, mit denen du effizient mit Verzeichnissen und ihren Inhalten arbeiten kannst. Schauen wir uns an, wie man einige der häufigsten Vorgänge durchführt.Verzeichnis der Verzeichnisse
Mit der Methode
iterdir()kannst du alle Dateien und Unterverzeichnisse in einem Ordner durchsuchen. Sie ist besonders nützlich, um alle Dateien in einem Verzeichnis zu bearbeiten oder Operationen an jedem einzelnen Eintrag durchzuführen.Da
iterdir()einen Iterator zurückgibt, werden die Einträge bei Bedarf abgerufen, während du die Schleife durchläufst.Die Methode is_dir()
Die Methode
is_dir()gibtTruezurück, wenn der Pfad auf ein Verzeichnis zeigt, ansonstenFalse.Die Methode is_file()
Die Methode
.is_file()gibtTruezurück, wenn der Pfad auf eine Datei zeigt, ansonstenFalse.Die Methode exists()
Da
PathObjekte nur Pfade darstellen, musst du manchmal mit der Methode.exists()überprüfen, ob ein Pfad existiert:Die Methode .exists() prüft, ob ein Pfad existiert. Das ist nützlich, weil
PathObjekte Dateien und Verzeichnisse repräsentieren können, die im Dateisystem vorhanden sein können oder auch nicht.Pfade erstellen und löschen
pathlibbietet auch Funktionen zum Erstellen und Löschen von Dateien und Verzeichnissen. Lass uns sehen, wie.Die Methode mkdir()
Die Methode
mkdir()erstellt ein neues Verzeichnis unter dem angegebenen Pfad. Standardmäßig wird das Verzeichnis im aktuellen Arbeitsverzeichnis erstellt.Die Methode mkdir(parents=True)
Die Methode
mkdir(parents=True)ist besonders nützlich, wenn du eine Verzeichnisstruktur erstellen willst, in der einige übergeordnete Verzeichnisse nicht existieren. Die Einstellungparents=Truestellt sicher, dass alle notwendigen übergeordneten Verzeichnisse auf dem Weg erstellt werden.Beachte, dass
mkdir()eine Ausnahme auslöst, wenn bereits ein Verzeichnis mit demselben Namen existiert.Die Methode unlink()
Die Methode
unlink()löscht eine Datei, die durch das ObjektPathrepräsentiert wird, dauerhaft. Es wird empfohlen, vor dem Ausführen dieser Methode zu prüfen, ob eine Datei vorhanden ist, um eine Fehlermeldung zu vermeiden.Die Methode rmdir()
Die Methode
rmdir()löscht ein leeres Verzeichnis. Denke daran, dassrmdir()nur leere Verzeichnisse entfernen kann. Der einfachste Weg, ein nicht leeres Verzeichnis zu löschen, ist die Verwendung der shutil-Bibliothek oder des Terminals.Hinweis: Sei bitte vorsichtig, wenn du
unlink()oderrmdir()benutzt, denn die Ergebnisse sind dauerhaft.Erweiterte Pfadmanipulation
Kommen wir nun zu einigen fortgeschrittenen Konzepten der Pfadmanipulation und wie man sie in der Praxis mit
pathlibanwendet.Relative vs. absolute Pfade
Wir fangen damit an, die Unterschiede zwischen absoluten und relativen Pfaden zu verstehen, da sie oft vorkommen.
Relative Pfade
Relative Pfade geben den Ort einer Datei oder eines Verzeichnisses relativ zum aktuellen Verzeichnis an, daher das Wort relativ. Sie sind kurz und flexibel innerhalb deines Projekts, können aber verwirrend sein, wenn du das Arbeitsverzeichnis wechselst.
Ich habe zum Beispiel einen Bilderordner in meinem aktuellen Arbeitsverzeichnis, der die Datei
midjourney.pngenthält.Der obige Code funktioniert jetzt, aber wenn ich das Notebook, das ich benutze, an einen anderen Ort verschiebe, bricht das Snippet ab, weil der Bilderordner nicht mit dem Notebook verschoben wurde.
Absolute Pfade
Absolute Pfade geben den vollständigen Speicherort einer Datei oder eines Verzeichnisses vom Stamm des Dateisystems aus an. Sie sind unabhängig vom aktuellen Verzeichnis und bieten einen eindeutigen Bezugspunkt für jeden Benutzer überall im System.
Wie du siehst, können absolute Pfade ziemlich lang sein, besonders in komplexen Projekten mit verschachtelten Baumstrukturen. Aus diesem Grund bevorzugen die meisten Menschen relative Pfade, die kürzer sind.
Methode auflösen
pathlibbietet Methoden, um relative Pfade mit der Methoderesolve()in absolute umzuwandeln.Wir können auch den umgekehrten Weg gehen: Wenn wir einen absoluten Pfad haben, können wir ihn in einen relativen Pfad umwandeln, der auf einem Referenzverzeichnis basiert.
Globbing
Um das Globbing zu veranschaulichen, können wir zu dem Beispiel zurückkehren, das wir zu Beginn des Artikels vorgestellt haben. Dort haben wir einen Code geschrieben, um alle
pngDateien in einem bestimmten Verzeichnis zu finden.pathlibverwendet das eingebaute Modul.glob(), um in einem beliebigen Verzeichnis effizient nach Dateien zu suchen, die einem bestimmten Muster entsprechen. Dieses Modul ist sehr nützlich, wenn Dateien mit ähnlichen Namen oder Erweiterungen verarbeitet werden sollen.Die glob-Methode akzeptiert eine Zeichenkette mit Platzhaltern als Eingabe und gibt ein Generatorobjekt zurück, das bei Bedarf passende
PathObjekte liefert:*: Passt auf null oder mehr Zeichen.?: Passt auf jedes einzelne Zeichen.[]: Entspricht einem Bereich von Zeichen, die in Klammern eingeschlossen sind (z. B. [a-z] entspricht einem beliebigen Kleinbuchstaben).Zur Veranschaulichung wollen wir versuchen, alle Jupyter-Notizbücher in meinem Artikelverzeichnis zu finden.
Die Methode
.glob()hat keine Notizbücher gefunden, was auf den ersten Blick überraschend erscheint, weil ich über 150 Artikel geschrieben habe. Der Grund dafür ist, dass.glob()nur innerhalb des angegebenen Verzeichnisses sucht, nicht in dessen Unterverzeichnissen.Wir können dieses Problem durch eine rekursive Suche lösen, für die wir die Methode
rglob()verwenden müssen, die eine ähnliche Syntax hat:Dieses Mal hat unser Code alle 357 Dateien gefunden.
Arbeiten mit Dateien
Wie wir gesehen haben, repräsentieren
PathObjekte nur Dateien, führen aber keine Operationen mit ihnen durch. Sie verfügen jedoch über bestimmte Methoden für gängige Dateioperationen. Wir werden in diesem Abschnitt sehen, wie man sie benutzt.Dateien lesen
Das Lesen von Dateiinhalten ist ein grundlegender Vorgang in vielen Python-Anwendungen.
pathlibbietet bequeme Kurzbefehle, um Dateien entweder als Text oder als Rohbytes zu lesen.Mit der Methode
read_text()können wir den Inhalt einer Textdatei lesen und die Datei schließen.Für Binärdateien können wir stattdessen die Methode
read_bytes()verwenden.Denke daran, dass bei der Verwendung einer
read_*Methode die Fehlerbehandlung wichtig ist:Dateien schreiben
Das Schreiben in Dateien ist so einfach wie das Lesen von Dateien. Um Dateien zu schreiben, haben wir die Methode
write_text().Wie wir sehen können, überschreibt die Methode
write_text()den Text. Obwohl es fürwrite_text()keinen Anfügemodus gibt, können wirread_text()undwrite_text()zusammen verwenden, um Text an das Ende der Datei anzuhängen.write_bytes()funktioniert auf ähnliche Weise. Zur Veranschaulichung duplizieren wir zunächst das Bildmidjourney.pngmit einem neuen Namen.Die Methode
with_stem()gibt einen Dateipfad mit einem anderen Dateinamen zurück (obwohl das Suffix dasselbe bleibt). So können wir ein Originalbild lesen und seinen Kontext in ein neues Bild schreiben.Umbenennen und Verschieben von Dateien
Zusätzlich zur Funktion
with_stem(), mit der du den Stamm einer Datei umbenennen kannst, bietetpathlibdie Methoderename(), mit der du die Datei noch vollständiger umbenennen kannst.rename()akzeptiert einen Zielpfad, der ein String oder ein anderes Pfadobjekt sein kann.Um Dateien zu verschieben, kannst du die Funktion
replace()verwenden, die auch einen Zielpfad akzeptiert:Leere Dateien erstellen
pathlibermöglicht es uns, leere Dateien mit der Methodetouchzu erstellen:Die Methode
touchist ursprünglich dafür gedacht, die Änderungszeit einer Datei zu aktualisieren, sie kann also auch für bestehende Dateien verwendet werden.Wenn du einen Dateinamen für eine spätere Verwendung reservieren musst, aber im Moment keinen Inhalt hast, den du hineinschreiben kannst, können wir mit touch einen Rohling erstellen. Die Methode wurde vom Unix-Terminalbefehl touch inspiriert.
Berechtigungen und Dateisysteminformationen
Als letzten Punkt lernen wir, wie man mit der Methode
.stat()auf Dateieigenschaften zugreift. Wenn du mitosvertraut bist, wirst du feststellen, dass diese neue Methode die gleiche Ausgabe wieos.stat()hat.Wir können die Dateigröße auch mit der Punktnotation abfragen.
Fazit
Die Einführung des Moduls
pathlibin Python 3.4 hat die Manipulation des Dateisystems für Entwickler erheblich vereinfacht. Durch einen objektorientierten Ansatz für die Behandlung von Dateipfaden bietetpathlibeine strukturierte und einfache Möglichkeit, Dateisystempfade darzustellen.pathlibist außerdem plattformunabhängig, d.h.pathlibbehandelt Pfadseparatoren auf verschiedenen Betriebssystemen einheitlich, sodass unser Code auf einem neuen Rechner nicht kaputt geht. Wie wir gesehen haben, bietetpathlibeine große Anzahl von prägnanten und ausdrucksstarken Methoden für gängige Dateisystemoperationen.Vergiss nicht, dass
pathlibeine von vielen leistungsstarken integrierten Bibliotheken in Python ist. In unseren Kursen "Data Scientist With Python Career Lernpfad", "Python Programming Skill Lernpfad" und "Intro to Python for Data Science" lernst du eine Vielzahl integrierter Bibliotheken kennen, die dich zu einem starken Python-Programmierer machen.Danke fürs Lesen!