Kurs
Viele Python-Programme müssen im Dateisystem navigieren, um Dateien zu lesen und zu schreiben. Eine häufige Operation ist das Abrufen des aktuellen Arbeitsverzeichnisses, das oft mit CWD abgekürzt wird.
Python verfügt über zwei Hauptmodule, die für den Zugriff auf die Dateisystempfade verwendet werden können: dasModul os
und das Modul pathlib
.
Das Modul os
bietet den traditionellen Ansatz, um das aktuelle Arbeitsverzeichnis zu ermitteln und arbeitet mit Pfaden und dem Dateisystem.
Das pathlib
ist ein neueres Modul, das einen objektorientierten Ansatz bietet, der robust und plattformübergreifend ist.
In diesem Lernprogramm erforsche ich die verschiedenen Techniken, um das aktuelle Arbeitsverzeichnis zu holen und zu bearbeiten. Wenn du mehr über Python erfahren möchtest, kannst du dich in meinen anderen Blogbeiträgen umsehen:
- Python Cache: Zwei einfache Methoden
- Python timedelta: Arbeiten mit Zeitintervallen in Python
- Wie man in Python Strings in Bytes umwandelt
Python: So erhältst du das aktuelle Arbeitsverzeichnis (CWD)
Das aktuelle Arbeitsverzeichnis ist das Verzeichnis, in dem ein Python-Programm ausgeführt wird. Sie dient als Referenzpunkt für relative Dateipfade und ermöglicht dem Programm den Zugriff auf Dateien und Ressourcen innerhalb der Verzeichnishierarchie.
Schauen wir uns an, wie man mit den Modulen os
und pathlib
auf das aktuelle Arbeitsverzeichnis zugreift und vergleichen die beiden Lösungen.
Mit os.getcwd()
Das Modul os
ermöglicht den Zugriff auf das Betriebssystem des Computers. Mit der Funktion getcwd()
kannst du das aktuelle Arbeitsverzeichnis abrufen:
import os
cwd = os.getcwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
Die Ausgabe zeigt den Pfad des Verzeichnisses an, das das Skript enthält. Das Format des Pfads hängt vom Betriebssystem ab. Die obige Ausgabe gilt für POSIX-Betriebssysteme wie Linux, Unix und macOS.
Auf einem Windows-System würde derselbe Pfad wie folgt angezeigt:
C:\Users\sg\Documents\GitHub\datacamp
Der von os.getcwd()
zurückgegebene Wert ist eine Zeichenkette:
print(type(cwd))
<class 'str'>
Deshalb müssen wir String-Methoden und andere String-Operationen verwenden, um mit diesem Pfad umzugehen.
Mit pathlib.Path.cwd()
Mit Python 3.4 wurde das Modul pathlib
eingeführt, das einen objektorientierten Ansatz für den Zugriff auf und die Bearbeitung von Dateipfaden bietet. Die wichtigste Klasse in pathlib
ist Path
, die wir importieren können, bevor wir das aktuelle Arbeitsverzeichnis erhalten:
from pathlib import Path
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
Die Druckausgabe von Path.cwd()
sieht ähnlich aus wie der Wert, der von os.getcwd()
zurückgegeben wird. Path.cwd()
gibt jedoch keine Zeichenkette zurück. Wir können dies bestätigen, indem wir den Typ des zurückgegebenen Objekts ausdrucken oder seine offizielle String-Repräsentation mit repr()
anzeigen:
print(type(cwd))
print(repr(cwd))
<class 'pathlib.PosixPath'>
PosixPath('/Users/sg/Documents/GitHub/datacamp')
Auf einem Windows-Computer gibt Path.cwd()
ein WindowsPath
Objekt zurück.
Die Objekte PosixPath
und WindowsPath
bieten ähnliche Funktionen, um plattformübergreifende Programme zu ermöglichen. Hier sind einige der Eigenschaften dieser Objekte:
print(cwd.parent)
print(cwd.name)
/Users/sg/Documents/GitHub
datacamp
Wann immer es möglich ist, solltest du das Modul pathlib
verwenden, das moderner ist und den Umgang mit Pfaden erleichtert. Du kannst diese umfassende Anleitung zur Verwendung von pathlib in Python lesen, wenn du mehr erfahren willst.
Arbeiten mit dem aktuellen Verzeichnis
Python-Programme müssen oft den Pfad manipulieren, zum Beispiel, um eine Datei in einem Unterordner zu speichern. Nehmen wir an, wir müssen ein neues Unterverzeichnis in unserem aktuellen Arbeitsverzeichnis erstellen und eine Textdatei in dem neuen Ordner speichern.
Mit dem os
Modul
Die Funktion getcwd()
im Modul os
gibt einen String zurück. Daher ist es möglich, diese Zeichenfolge manuell zu ändern, um den Pfad zu ändern. Die erforderlichen Änderungen sind jedoch je nach Betriebssystem unterschiedlich, da verschiedene Systeme unterschiedliche Pfadformate haben. Eine bessere Option ist die Verwendung von os.path.join()
:
import os
cwd = os.getcwd()
output_path = os.path.join(cwd, "testing_os")
print(output_path)
/Users/sg/Documents/GitHub/datacamp/testing_os
Der Pfad, den os.path.join()
zurückgibt, hat das richtige Format für das verwendete Betriebssystem. Dies gibt einen String mit dem neuen Pfad zurück. Wir können überprüfen, ob dieser Unterordner existiert, indem wir os.path.exists()
verwenden, das einen booleschen Wert zurückgibt:
print(os.path.exists(output_path))
False
Das zeigt, dass der Pfad, der durch output_path
dargestellt wird, noch nicht existiert. Das Modul os
bietet Werkzeuge, um diesen Ordner zu erstellen. Die Funktion os.mkdir()
erstellt ein neues Verzeichnis:
os.mkdir(output_path)
print(os.path.exists(output_path))
True
Der neue Unterordner existiert jetzt und neue Dateien können in diesem Ordner gespeichert werden:
output_file = os.path.join(output_path, "test.txt")
with open(output_file, "w") as file:
file.write("Testing path modification with the 'os' module")
Die Variable output_file
enthält den Namen der gewünschten Ausgabedatei mit dem vollständigen Pfad. Diese Textdatei wird im Unterordner /testing_os
im aktuellen Arbeitsverzeichnis erstellt.
Wir können auch alle Objekte in einem Ordner mit os.listdir()
auflisten:
for item in os.listdir(output_path):
print(item)
test.txt
Die Funktion os.listdir()
gibt eine Liste mit allen Einträgen im Verzeichnis zurück. Dieser Code durchläuft diese Liste und zeigt jede Datei oder jeden Ordner in einer eigenen Zeile an. In diesem Beispiel enthält das Verzeichnis eine einzelne Textdatei.
Mit dem pathlib
Modul
Das neuere Modul pathlib
bietet auch Werkzeuge, um neue Pfade zu erstellen. Dieses Modul verwendet den Schrägstrich-Operator /
, um Elemente in einem Pfad zu kombinieren. Dies ist derselbe Operator, der für die Division von numerischen Datentypen verwendet wird, aber es ist auch das Zeichen, das in Dateipfaden in POSIX-Betriebssystemen verwendet wird. Erstellen wir einen neuen Pfad und überprüfen wir, ob er nicht schon existiert:
from pathlib import Path
cwd = Path.cwd()
output_path = cwd / "testing_pathlib"
print(output_path)
print(Path.exists(output_path))
/Users/sg/Documents/GitHub/datacamp/testing_pathlib
False
Die Klasse Path
hat ihre eigene Methode .mkdir()
, um ein neues Verzeichnis zu erstellen:
Path.mkdir(output_path)
print(Path.exists(output_path))
True
Da output_path
ein PosixPath
oder WindowsPath
Objekt ist, können wir den Schrägstrich-Operator überall verwenden, um einen neuen Pfad zu erstellen:
with open(output_path / "test.txt", "w") as file:
file.write("Testing path modification with the 'pathlib' module")
Die neue Textdatei wird im Ordner /testing_pathlib
erstellt.
Wir können die Methode Path
.iterdir()
verwenden, um jedes Element in einem Ordner zu durchlaufen:
for item in Path.iterdir(output_path):
print(item)
/Users/sg/Documents/GitHub/datacamp/testing_pathlib/test.txt
Wie bei anderen Tools in pathlib
ist der zurückgegebene Wert keine Zeichenkette. Stattdessen ist es ein PosixPath
oder WindowsPath
Objekt. Wir können das Attribut .name
verwenden, um den Datei- oder Ordnernamen ohne den vollständigen Pfad anzuzeigen:
for item in Path.iterdir(output_path):
print(item.name)
test.txt
Während os.listdir()
eine Liste zurückgibt, gibt pathlib.Path.iterdir()
ein generator
Objekt zurück (du kannst dieses Tutorial über Python Iteratoren und Generatoren lesen, wenn du eine Auffrischung brauchst):
print(Path.iterdir(cwd))
<generator object Path.iterdir at 0x1036b2c20>
Dieses Verhalten entspricht den besten Praktiken in modernem Python, da Iteratoren und Generatoren in bestimmten Situationen effizienter sind.
Ändern des aktuellen Arbeitsverzeichnisses (CWD)
Es ist auch möglich, das aktuelle Arbeitsverzeichnis direkt aus einem Python-Programm heraus zu wechseln: os.chdir()
. Da dies keine Operation ist, die direkt mit dem Pfad zusammenhängt, gibt es keine alternative Version in pathlib
. Wir können aber trotzdem pathlib.Path
Objekte als Argumente verwenden:
import os
from pathlib import Path
cwd = Path.cwd()
print(cwd)
os.chdir(cwd.parent)
cwd = Path.cwd()
print(cwd)
/Users/sg/Documents/GitHub/datacamp
/Users/sg/Documents/GitHub
Das Arbeitsverzeichnis hat sich nun geändert. Wir können auch cwd.parent.resolve()
verwenden, um sicherzustellen, dass alle symbolischen Links richtig behandelt werden. Das Argument in os.chdir()
kann auch eine Zeichenkette sein, wie zum Beispiel die Pfade, die von den Funktionen im Modul os
zurückgegeben werden.
Beim Ändern des Arbeitsverzeichnisses innerhalb eines Programms ist Vorsicht geboten, damit es nicht zu unerwarteten Verhaltensweisen kommt.
Bewährte Praktiken und Tipps
Hier sind einige bewährte Methoden und Tipps für die Arbeit mit Pfaden in Python:
Fazit
Das Navigieren und Manipulieren von Dateipfaden ist eine häufige Anforderung in vielen Python-Programmen. Das Modul os
bietet die traditionellen Funktionen für die Bearbeitung dieser Aufgaben, während das Modul pathlib
einen moderneren, objektorientierten Ansatz bietet. Die Verwendung von pathlib
vereinfacht nicht nur viele Vorgänge, sondern sorgt auch dafür, dass dein Code plattformübergreifend und leichter lesbar bleibt.
Ganz gleich, ob du eine bestehende Codebasis pflegst, die os
verwendet, oder ein neues Projekt beginnst, bei dem du pathlib
nutzen kannst: Wenn du beide Module und ihre Fähigkeiten verstehst, kannst du Pfade in jedem Python-Projekt flexibel und sicher verwalten.
Mit diesen Kursen kannst du deine Python-Lernreise fortsetzen:
Ich habe Physik und Mathematik auf UG-Ebene an der Universität Malta studiert. Dann zog ich nach London und machte meinen Doktor in Physik am Imperial College. Ich habe an neuartigen optischen Techniken zur Abbildung der menschlichen Netzhaut gearbeitet. Jetzt konzentriere ich mich darauf, über Python zu schreiben, über Python zu kommunizieren und Python zu unterrichten.