Gibt es eine Möglichkeit, eine Liste aller Unterverzeichnisse im aktuellen Verzeichnis in Python zurückzugeben?
Ich weiß, dass Sie dies mit Dateien tun können, aber ich muss stattdessen die Liste der Verzeichnisse abrufen.
python
directory
subdirectory
Brad Zeis
quelle
quelle
Antworten:
Meinen Sie unmittelbare Unterverzeichnisse oder jedes Verzeichnis direkt im Baum?
In beiden Fällen können Sie Folgendes
os.walk
tun:gibt für jedes Unterverzeichnis ein Tupel aus. Dieser erste Eintrag im 3-Tupel ist also ein Verzeichnisname
sollte Ihnen alle Unterverzeichnisse rekursiv geben.
Beachten Sie, dass der zweite Eintrag im Tupel die Liste der untergeordneten Verzeichnisse des Eintrags an der ersten Position ist. Sie können ihn also stattdessen verwenden, aber es ist unwahrscheinlich, dass Sie viel sparen.
Sie können es jedoch nur verwenden, um Ihnen die unmittelbaren untergeordneten Verzeichnisse zu geben:
Oder sehen Sie sich die anderen bereits veröffentlichten Lösungen an, die
os.listdir
und verwendenos.path.isdir
, einschließlich der unter " So erhalten Sie alle unmittelbaren Unterverzeichnisse in Python ".quelle
os.walk('.').next()[1]
oderos.walk('.').__next__()[1]
direkt. Verwenden Sie stattdessen die integrierte Funktionnext()
, die sowohl in Python 2 (siehe Dokument) als auch in Python 3 (siehe Dokument) verfügbar ist . Zum Beispiel :next(os.walk('.'))[1]
.os.walk('.').next()[1]
direkt zu verwenden ?iteraror.__next__()
es sich um eine interne Methode handelt und dieiterator.next()
Verwendungnext()
gemäß PEP-3114 auf die integrierte Methode umgestellt werden sollte . Siehe PEP-3114, das 2007 genehmigt wurde.os.walk
undos.listdir
+os.path.isdir
Lösungen machen: Ich habe gerade in einem Verzeichnis mit 10.000 Unterverzeichnissen (mit Millionen von Dateien in der folgenden Hierarchie) getestet, und die Leistungsunterschiede sind vernachlässigbar.os.walk
: "10 Schleifen, am besten 3: 44,6 ms pro Schleife" undos.listdir
+os.path.isdir
: "10 Schleifen, am besten 3: 45,1 ms pro Schleife"quelle
os.path.join
On ausführeno
, um den vollständigen Pfad zu erhalten. Andernfallsisdir(0)
wird immer false zurückgegebenos.path.join
zweimalos.path.isdir
filter(os.path.isdir, [os.path.join(d, o) for o in os.listdir(d)])
Sie könnten einfach verwenden
glob.glob
Vergessen Sie nicht das Nachlaufen
/
nach dem*
.quelle
/
/
, derglob(os.path.join(path_to_directory, "*", ""))
recursive=True
Viel schöner als die oben genannten, da Sie nicht mehrere os.path.join () benötigen und den vollständigen Pfad direkt erhalten (wenn Sie dies wünschen), können Sie dies in Python 3.5 und höher tun .
Dadurch wird der vollständige Pfad zum Unterverzeichnis angegeben. Wenn Sie nur den Namen des Unterverzeichnisses möchten, verwenden Sie
f.name
stattdessenf.path
https://docs.python.org/3/library/os.html#os.scandir
Etwas OT: Wenn Sie alle Unterordner rekursiv und / oder alle Dateien rekursiv benötigen , sehen Sie sich diese Funktion an, die schneller als
os.walk
& istglob
und eine Liste aller Unterordner sowie aller Dateien in diesen (Unter-) Unterordnern zurückgibt: https://stackoverflow.com/a/59803793/2441026Falls Sie nur alle Unterordner rekursiv möchten :
Gibt eine Liste aller Unterordner mit ihren vollständigen Pfaden zurück. Dies ist wieder schneller als
os.walk
und viel schneller alsglob
.Eine Analyse aller Funktionen
tl; dr:
- Wenn Sie alle unmittelbaren Unterverzeichnisse für einen Ordner abrufen möchten, verwenden Sie
os.scandir
.- Wenn Sie alle Unterverzeichnisse abrufen möchten , auch verschachtelte , verwenden Sie
os.walk
diefast_scandir
obige Funktion oder - etwas schneller - .- Niemals
os.walk
nur für Unterverzeichnisse der obersten Ebene verwenden, da dies hunderte (!) Mal langsamer sein kann alsos.scandir
.os.walk
wird der Basisordner sein. Sie erhalten also nicht nur Unterverzeichnisse. Sie können es verwendenfu.pop(0)
, um es zu entfernen.Ergebnisse :
Getestet mit W7x64, Python 3.8.1.
quelle
Wenn Sie eine rekursive Lösung benötigen, die alle Unterverzeichnisse in den Unterverzeichnissen findet, verwenden Sie walk wie zuvor vorgeschlagen.
Wenn Sie nur die untergeordneten Verzeichnisse des aktuellen Verzeichnisses benötigen, kombinieren Sie
os.listdir
mitos.path.isdir
quelle
Ich bevorzuge die Verwendung von Filtern ( https://docs.python.org/2/library/functions.html#filter ), aber dies ist nur eine Frage des Geschmacks.
quelle
Implementiert dies mit Python-Os-Walk. ( http://www.pythonforbeginners.com/code-snippets-source-code/python-os-walk/ )
quelle
Sie können die Liste der Unterverzeichnisse (und Dateien) in Python 2.7 mit os.listdir (Pfad) abrufen.
quelle
os.listdir
Inhalt des Verzeichnisses einschließlich der Dateien aufgelistet ist.Nur Verzeichnisse auflisten
Nur Dateien im aktuellen Verzeichnis auflisten
quelle
Python 3.4 führte das
pathlib
Modul in die Standardbibliothek ein, die einen objektorientierten Ansatz für die Verarbeitung von Dateisystempfaden bietet:Pathlib ist auch in Python 2.7 über das pathlib2-Modul auf PyPi verfügbar.
quelle
for f in filter(Path.is_dir, p.iterdir()):
Da ich bei der Verwendung von Python 3.4- und Windows UNC-Pfaden auf dieses Problem gestoßen bin, gibt es hier eine Variante für diese Umgebung:
Pathlib ist neu in Python 3.4 und erleichtert die Arbeit mit Pfaden unter verschiedenen Betriebssystemen erheblich: https://docs.python.org/3.4/library/pathlib.html
quelle
Obwohl diese Frage schon vor langer Zeit beantwortet wurde. Ich möchte empfehlen, die zu verwenden
pathlib
Modul zu verwenden, da dies eine robuste Methode ist, um unter Windows und Unix zu arbeiten.So rufen Sie alle Pfade in einem bestimmten Verzeichnis ab, einschließlich der Unterverzeichnisse:
usw.
quelle
Danke für die Tipps, Leute. Ich bin auf ein Problem gestoßen, bei dem Softlinks (unendliche Rekursion) als Verzeichnisse zurückgegeben wurden. Softlinks? Wir wollen keine stinkenden Softlinks! Damit...
Dadurch wurden nur die Verzeichnisse und keine Softlinks gerendert:
quelle
[x[0] for x in inf]
heißt Python, damit ich es nachschlagen kann?Kopieren Einfügen freundlich in
ipython
:Ausgabe von
print(folders)
:quelle
x
ist das Element aus der Liste, das von erstellt wurde,os.listdir(d)
weillistdir
Dateien und Ordner zurückgegeben werden, mit denen er denfilter
Befehl verwendetos.path.isdir
, um alle Dateien aus der Liste herauszufiltern.So mache ich es.
quelle
Hier sind einige einfache Funktionen, die auf dem Beispiel von @Blair Conrad basieren:
quelle
Verwenden Sie das folgende Beispiel, um auf der Lösung von Eli Bendersky aufzubauen:
Wo
<your_directory>
ist der Pfad zu dem Verzeichnis, das Sie durchlaufen möchten?quelle
Mit vollständigem Pfad und einen Anteil von Pfad Wesen
.
,..
,\\
,..\\..\\subfolder
, etc:quelle
Diese Antwort schien noch nicht zu existieren.
quelle
Ich hatte kürzlich eine ähnliche Frage und fand heraus, dass die beste Antwort für Python 3.6 (wie Benutzer Havlock hinzugefügt hat) die Verwendung ist
os.scandir
. Da es anscheinend keine Lösung gibt, werde ich meine eigene hinzufügen. Erstens eine nicht rekursive Lösung, die nur die Unterverzeichnisse direkt unter dem Stammverzeichnis auflistet.Die rekursive Version würde folgendermaßen aussehen:
Denken Sie daran, dass dies
entry.path
den absoluten Pfad zum Unterverzeichnis darstellt. Falls Sie nur den Ordnernamen benötigen, können Sieentry.name
stattdessen verwenden. Weitere Informationen zum Objekt finden Sie unter os.DirEntryentry
.quelle
Verwenden Sie eine Filterfunktion
os.path.isdir
für soos.listdir()
etwasfilter(os.path.isdir,[os.path.join(os.path.abspath('PATH'),p) for p in os.listdir('PATH/')])
quelle
Dadurch werden alle Unterverzeichnisse direkt im Dateibaum aufgelistet.
pathlib
ist neu in Version 3.4quelle
Funktion zum Zurückgeben einer Liste aller Unterverzeichnisse innerhalb eines bestimmten Dateipfads. Durchsucht den gesamten Dateibaum.
quelle
Mit os.walk () können wir eine Liste aller Ordner abrufen.
Dieses pathObject ist ein Objekt und wir können ein Array von erhalten
Wir können eine Liste aller Unterverzeichnisse erhalten, indem wir das arr durchlaufen und das mittlere Array drucken
Dadurch wird das gesamte Unterverzeichnis gedruckt.
So erhalten Sie alle Dateien:
quelle
Diese Funktion mit einem bestimmten übergeordneten
directory
Element durchläuft alledirectories
rekursiven Funktionen undprints
allefilenames
darin enthaltenen Elemente. Zu nützlich.quelle
Durch die Verbindung mehrerer Lösungen von hier aus habe ich Folgendes verwendet:
quelle