HOWTO · Python

Zählen Sie die Anzahl der Dateien in einem Verzeichnis in Python

Dieses Tutorial zeigt, wie Sie die Anzahl der Dateien in einem Verzeichnis in Python zählen.

Auf dieser Seite

Um Dateieinträge in einem bestimmten Verzeichnis zu zählen, durchlaufe seine Einträge und prüfe jeden mit Path.is_file(). Diese Prüfungen folgen symbolischen Links: Ein Eintrag wird gezählt, wenn sein Ziel eine Datei ist, auch wenn es sich um einen symbolischen Link auf eine Datei handelt. Die folgenden Beispiele unterscheiden zwischen einer Zählung der direkten Verzeichniseinträge, einer rekursiven Suche und einer Mustersuche. Relative Pfade werden vom aktuellen Arbeitsverzeichnis von Python aus aufgelöst. Verwende daher einen absoluten Pfad oder lege das Arbeitsverzeichnis gezielt fest, wenn der Speicherort wichtig ist.

Dateien in einem Verzeichnis mit pathlib zählen

Path.iterdir() liefert die direkten Einträge eines Verzeichnisses. Kombiniere die Methode mit Path.is_file(), um Einträge zu zählen, deren Ziele Dateien sind – einschließlich symbolischer Links auf Dateien – und Unterverzeichnisse auszuschließen. Das Beispiel erstellt eine kleine Verzeichnisstruktur: Auf der obersten Ebene liegen zwei Dateien und ein Unterverzeichnis.

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as temp_dir:
    directory = Path(temp_dir)
    (directory / "alpha.txt").write_text("A", encoding="utf-8")
    (directory / "beta.csv").write_text("B", encoding="utf-8")
    child = directory / "nested"
    child.mkdir()
    (child / "gamma.txt").write_text("C", encoding="utf-8")

    count = sum(1 for entry in directory.iterdir() if entry.is_file())
    print(f"Number of files: {count}")
Number of files: 2

Die Anzahl beträgt zwei, weil iterdir() nur die direkten Einträge untersucht und is_file() das Verzeichnis nested herausfiltert. Ändere directory in den Pfad, den du untersuchen möchtest. Diese Methode eignet sich gut als Standardlösung, wenn es um ein einzelnes Verzeichnis geht und gut lesbare Pfadoperationen hilfreich sind.

Dateien in einem Verzeichnis mit os.listdir() zählen

os.listdir(directory_path) gibt die Namen aller direkten Einträge im angegebenen Verzeichnis zurück, einschließlich der Verzeichnisnamen. Die Eintragsnamen werden unabhängig davon zurückgegeben, ob directory_path eine Zeichenkette oder ein anderes pfadähnliches Objekt ist. Verbinde jeden Namen mit dem Verzeichnis zu einem Pfad, bevor du mit os.path.isfile() prüfst, ob das Ziel des Eintrags eine Datei ist. So werden auch symbolische Links auf Dateien gezählt:

sum(1 for name in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, name)))

Diese Zählung erfolgt nicht rekursiv. Wenn directory_path weggelassen wird, listet os.listdir() das aktuelle Arbeitsverzeichnis auf. Übergib einen expliziten Pfad, wenn das Programm nicht davon abhängen soll, aus welchem Verzeichnis es gestartet wurde. Dieser Ansatz ist nützlich, wenn du die Namen für weitere Verarbeitungsschritte benötigst.

Dateien effizient mit os.scandir() zählen

os.scandir(directory_path) gibt einen Iterator mit os.DirEntry-Objekten zurück. Jeder Eintrag kann seinen Typ mit is_file() prüfen. Die Methode folgt standardmäßig symbolischen Links und zählt daher Einträge, deren Ziele Dateien sind, einschließlich symbolischer Links auf Dateien. Eine Zählung lässt sich so schreiben:

sum(1 for entry in os.scandir(directory_path) if entry.is_file())

Der Iterator umfasst die direkten Einträge, nicht die Unterverzeichnisse. Verwende beim expliziten Durchlaufen with os.scandir(directory_path) as entries:, damit der Verzeichnisiterator zeitnah geschlossen wird. scandir() kann bei großen Verzeichnissen oder dann sinnvoll sein, wenn mehrere Attribute der Einträge benötigt werden. Die tatsächliche Leistung hängt jedoch vom Dateisystem und der Arbeitslast ab. Miss daher deinen eigenen Anwendungsfall, bevor du von einem Geschwindigkeitsvorteil ausgehst.

Dateien rekursiv mit os.walk() zählen

Verwende os.walk(directory_path), wenn die Zählung Dateien im Verzeichnis und in seinen Unterverzeichnissen umfassen soll. Für jedes durchlaufene Verzeichnis liefert die Funktion den aktuellen Pfad, die Namen der Unterverzeichnisse und die Dateinamen. Die Liste files kann Namen symbolischer Links enthalten, deren Ziele Dateien sind; ihre Länge mitzuzählen berücksichtigt also auch diese Einträge. Addiere die Länge jeder files-Liste:

sum(len(files) for _, _, files in os.walk(directory_path))

Im Gegensatz zu den vorherigen Methoden zählt dieser Ansatz den gesamten Verzeichnisbaum. os.walk() führt normalerweise Dateinamen in seiner Dateiliste auf und schließt Unterverzeichnisse aus. Wenn Links oder gleichzeitig veränderte Verzeichnisse für deine Anwendung relevant sind, lege fest, wie damit umzugehen ist. Ein nicht vorhandenes Startverzeichnis führt standardmäßig zu keinen Ergebnissen, sodass die Summe null beträgt.

Dateien zählen, die auf glob.glob() passen

glob.glob() wählt Pfade anhand eines Musters aus. Zum Beispiel findet glob.glob(os.path.join(directory_path, "*.txt")) .txt-Dateien direkt im angegebenen Verzeichnis. Das Muster durchsucht keine Unterverzeichnisse. Verwende ein rekursives Muster wie **/*.txt zusammen mit recursive=True, wenn auch verschachtelte Treffer berücksichtigt werden sollen.

Ein Muster kann auch auf ein Verzeichnis passen, dessen Name dem Muster entspricht. Filtere die zurückgegebenen Pfade mit os.path.isfile(), um Einträge zu zählen, deren Ziele Dateien sind – einschließlich symbolischer Links auf Dateien:

sum(1 for path in glob.glob(os.path.join(directory_path, "*.txt")) if os.path.isfile(path))

Wähle pathlib für eine einfache Zählung der direkten Einträge, listdir() wenn du die Namen der Einträge brauchst, scandir() wenn du Eintragsobjekte benötigst, os.walk() für den gesamten Verzeichnisbaum oder glob.glob(), wenn ein Dateinamensmuster bestimmt, was gezählt werden soll.