HOWTO · Python
Alle Dateien im Verzeichnis und Unterverzeichnissen in Python auflisten
Dieses Tutorial zeigt, wie Sie alle Dateien in einem Verzeichnis und Unterverzeichnissen in Python auflisten.
Auf dieser Seite
Um die Pfade aller Dateien unterhalb eines Startverzeichnisses zu erfassen, verwenden Sie os.walk() aus Python. Die Funktion durchläuft den Verzeichnisbaum und liefert für jedes aktuelle Verzeichnis dessen Pfad, die Namen der Unterverzeichnisse und die Dateinamen. Verknüpfen Sie den Pfad des aktuellen Verzeichnisses mit jedem Dateinamen, um einen vollständigen Pfad zu erhalten. Die Beispiele listen Dateien auf, keine Verzeichniseinträge.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
from pathlib import Path
import os
import tempfile
with tempfile.TemporaryDirectory() as temporary_directory:
root = Path(temporary_directory) / "project"
(root / "reports").mkdir(parents=True)
for relative_path in ("notes", "data.csv", "reports/summary.txt", "reports/2025.csv"):
(root / relative_path).write_text("sample", encoding="utf-8")
for current, directories, filenames in os.walk(root):
directories.sort()
for filename in sorted(filenames):
print(Path(current, filename).relative_to(root))
data.csv
notes
reports/2025.csv
reports/summary.txt
Dieses temporäre Beispiel erstellt einen eigenen Verzeichnisbaum, einschließlich einer Datei ohne Erweiterung, und gibt Pfade relativ zum Startverzeichnis aus. Verwenden Sie stattdessen Path(current, filename) oder os.path.join(current, filename), um vollständige Pfade zu erstellen. Relative Pfade sind praktisch, wenn Sie Ergebnisse speichern; absolute Pfade eignen sich, wenn Sie Dateien an anderen Code übergeben. Die Pfadtrenner richten sich nach dem aktuellen Betriebssystem.
os.walk() zum rekursiven Auflisten von Dateien verwenden
Die obige Schleife verwendet os.walk() als einfache Standardlösung für eine rekursive Auflistung. Bei jedem Schleifendurchlauf ist der erste Wert der Pfad des aktuellen Verzeichnisses, der zweite eine veränderbare Liste mit den Namen der Unterverzeichnisse und der dritte die Dateinamen in diesem Verzeichnis. Iterieren Sie über den dritten Wert, damit keine Verzeichnisse in die Ergebnisse gelangen. Sortieren Sie die Namen der Unterverzeichnisse, wenn eine stabile Reihenfolge beim Durchlaufen wichtig ist. Standardmäßig werden Traversierungsfehler ignoriert; übergeben Sie onerror, wenn Ihre Anwendung solche Fehler melden soll.
os.listdir() für eine benutzerdefinierte rekursive Traversierung verwenden
os.listdir(path) gibt die Namen der Einträge in einem einzelnen Verzeichnis zurück; Unterverzeichnisse werden nicht besucht. Für eine eigene Traversierung verwalten Sie einen Stapel der zu prüfenden Pfade. Iterieren Sie für jeden Pfad über os.listdir(path), verbinden Sie jeden Namen mit seinem übergeordneten Pfad mithilfe von os.path.join(), fügen Sie Dateien dem Ergebnis hinzu und legen Sie Verzeichnisse auf dem Stapel ab. Prüfen Sie Einträge mit os.path.isfile() und os.path.isdir(). Dieser Ansatz bietet Kontrolle über die Reihenfolge und Filterung, aber Sie müssen die Traversierung und den Umgang mit Dateisystemfehlern selbst implementieren.
os.scandir() zum Prüfen von Verzeichniseinträgen verwenden
os.scandir(path) liefert DirEntry-Objekte für ein einzelnes Verzeichnis. Mit den Methoden is_file() und is_dir() lässt sich bequem entscheiden, welche Einträge erfasst und welche Unterverzeichnisse besucht werden sollen. Verwenden Sie dieselbe stapelbasierte Traversierung wie oben und öffnen Sie jedes Verzeichnis mit with os.scandir(path) as entries:, damit der Iterator zuverlässig geschlossen wird. Dieser Ansatz ist nützlich, wenn der Typ oder die Metadaten eines Eintrags Ihre Entscheidung beeinflussen.
glob.glob() zum Abgleich von Dateien mit einem Muster verwenden
Für eine Auswahl anhand eines Musters findet glob.glob(os.path.join(root, "**", "*"), recursive=True) Namen in beliebiger Tiefe, auch Namen ohne Dateierweiterung. Bei aktiviertem recursive=True erstreckt sich die Komponente ** über Verzeichnisse. Glob-Ergebnisse können auch Verzeichnisse enthalten. Wenn das Ergebnis nur Dateien enthalten soll, filtern Sie sie daher mit os.path.isfile(path). Mit einem enger gefassten Muster wie "**/*.csv" wählen Sie einen Dateityp aus; "*.*" schließt Namen ohne Punkt aus.
pathlib.Path zum rekursiven Auflisten von Dateien verwenden
pathlib.Path(root).rglob("*") liefert rekursiv Pfade unterhalb des Stammverzeichnisses. Filtern Sie die Ergebnisse mit path.is_file(), um Verzeichnisse auszuschließen. Die zurückgegebenen Objekte sind Path-Instanzen. Dadurch stehen Methoden wie relative_to(root) und name zur Verfügung, ohne dass Sie Zeichenfolgen manuell zusammensetzen müssen. Verwenden Sie str(path), wenn eine Schnittstelle einen Pfad als Zeichenfolge erwartet.
Eine Methode passend zur Aufgabe auswählen
Wählen Sie os.walk() als übersichtliche Standardlösung, wenn Dateinamen und Namen von Unterverzeichnissen getrennt geliefert werden sollen. Verwenden Sie os.scandir(), wenn Sie während der Traversierung Eintragstypen oder Metadaten prüfen müssen. Nutzen Sie glob.glob() für die Suche anhand eines Musters und pathlib.Path.rglob() für die Arbeit mit Pfadobjekten. Greifen Sie zu os.listdir(), wenn Sie eine eigene Traversierungslogik benötigen und bereit sind, diese selbst zu implementieren. Diese Ansätze liefern Pfade oder Namen, nicht den Dateiinhalt; zum Lesen oder Verarbeiten müssen Sie eine Datei separat über ihren Pfad öffnen. Für ein fehlendes oder nicht lesbares Startverzeichnis sollten Sie Dateisystemfehler entsprechend der verwendeten API und den Anforderungen Ihrer Anwendung behandeln.