Ich weiß, dass wir damit os.walk()
alle Unterverzeichnisse oder alle Dateien in einem Verzeichnis auflisten können. Ich möchte jedoch den vollständigen Inhalt des Verzeichnisbaums auflisten:
- Subdirectory 1:
- file11
- file12
- Sub-sub-directory 11:
- file111
- file112
- Subdirectory 2:
- file21
- sub-sub-directory 21
- sub-sub-directory 22
- sub-sub-sub-directory 221
- file 2211
Wie erreicht man dies am besten in Python?
ValueError: zero length field name in format
wird geworfen.root.replace(startpath, '', 1)
sollte das behebenÄhnlich wie bei den obigen Antworten, jedoch für Python3, wohl lesbar und wohl erweiterbar:
Anwendungsbeispiel:
Beispielausgabe:
Anmerkungen
Bearbeiten:
quelle
Eine Lösung ohne Einrückung:
os.walk macht bereits den Top-Down-Spaziergang, den Sie suchen.
Das Ignorieren der Verzeichnisliste verhindert die von Ihnen erwähnte Überlappung.
quelle
NameError: name 'path' is not defined
Wir bevorzugen normalerweise nur die Verwendung des GNU-Baums, haben dies jedoch nicht immer
tree
auf jedem System, und manchmal ist Python 3 verfügbar. Eine gute Antwort hier könnte leicht kopiert werden und GNU nichttree
zur Anforderung machen.tree
Die Ausgabe sieht folgendermaßen aus:Ich habe die obige Verzeichnisstruktur in meinem Home-Verzeichnis unter einem von mir aufgerufenen Verzeichnis erstellt
pyscratch
.Ich sehe hier auch andere Antworten, die sich dieser Art von Ausgabe nähern, aber ich denke, wir können es besser machen, mit einfacherem, modernerem Code und trägen Bewertungen von Ansätzen.
Baum in Python
Lassen Sie uns zunächst ein Beispiel dafür verwenden
Path
Objektyield
undyield from
(die eine Generatorfunktion erstellen)und nun:
Drucke:
Wir müssen jedes Verzeichnis in einer Liste materialisieren, weil wir wissen müssen, wie lange es dauert, aber danach werfen wir die Liste weg. Für eine tiefe und breite Rekursion sollte dies faul genug sein.
Der obige Code mit den Kommentaren sollte ausreichen, um vollständig zu verstehen, was wir hier tun. Sie können ihn jedoch auch mit einem Debugger durchgehen, um ihn bei Bedarf besser zu überprüfen.
Mehr Funktionen
Jetzt
tree
bietet uns GNU einige nützliche Funktionen, die ich mit dieser Funktion haben möchte:n directories, m files
-L level
-d
Wenn es einen großen Baum gibt, ist es auch nützlich, die Iteration (z. B. mit
islice
) zu begrenzen , um zu vermeiden, dass Ihr Interpreter mit Text blockiert wird, da die Ausgabe irgendwann zu ausführlich wird, um nützlich zu sein. Wir können dies standardmäßig beliebig hoch machen - sagen wir1000
.Entfernen wir also die vorherigen Kommentare und füllen Sie diese Funktion aus:
Und jetzt können wir die gleiche Art von Ausgabe erhalten wie
tree
:Drucke:
Und wir können uns auf Ebenen beschränken:
Drucke:
Und wir können die Ausgabe auf Verzeichnisse beschränken:
Drucke:
Rückblick
Im Nachhinein hätten wir das
path.glob
Matching verwenden können. Wir könnten es vielleicht auchpath.rglob
für rekursives Globbing verwenden, aber das würde ein Umschreiben erfordern. Wir könnten auchitertools.tee
eine Liste von Verzeichnisinhalten verwenden, anstatt sie zu materialisieren, aber das könnte negative Kompromisse haben und den Code wahrscheinlich noch komplexer machen.Kommentare sind willkommen!
quelle
elif not limit_to_directories:
fügen Sie die folgende:info = prefix + pointer + path.name; try: with path.open('r') as f: n_lines = len(f.readlines()); loc = f' LOC: {n_lines}'; info += loc; except UnicodeDecodeError: pass; yield info
Siehe diesen Link für die richtige white-space.contents
gefiltert werden muss, wennlimit_to_directories
True ist. Andernfalls wird der Baum nicht korrekt gezeichnet, wenn ein Ordner kein Verzeichnis für die letzte Datei enthält.if limit_to_directories: contents = [path for path in contents if path.is_dir()]
list(dir_path.iterdir())
Rückgabe eines ordnungsgemäß geordneten Top-Down-Baums der Verzeichnisstruktur. Ich sehe keine solche Garantie in der API für iterdir () . Bitte geben Sie an, wieiterdir()
Bestellungen oder garantiert die gewünschte Bestellung liefern.os.listdir()
standardmäßig zu verwenden - , die keine Garantie für die Reihenfolge gibt : "Die Liste ist in beliebiger Reihenfolge und enthält keine speziellen Einträge '.' und '..' auch wenn sie im Verzeichnis vorhanden sind. "Ich kam hierher, um das Gleiche zu suchen und benutzte Dhobbs Antwort für mich. Um der Community zu danken, habe ich einige Argumente hinzugefügt, um in eine Datei zu schreiben, wie akshay gefragt hat, und das Anzeigen von Dateien optional gemacht, damit es nicht so sehr eine Ausgabe ist. Außerdem wurde der Einzug zu einem optionalen Argument gemacht, damit Sie ihn ändern können, da einige es als 2 und andere als 4 bevorzugen.
Es wurden verschiedene Schleifen verwendet, sodass diejenige, die keine Dateien anzeigt, nicht bei jeder Iteration prüft, ob dies erforderlich ist.
Hoffe, es hilft jemand anderem, da Dhobbs Antwort mir geholfen hat. Vielen Dank.
quelle
Basierend auf diesem fantastischen Beitrag
http://code.activestate.com/recipes/217212-treepy-graphically-displays-the-directory-structur/
Hier ist es eine Verfeinerung, sich genau so zu verhalten
http://linux.die.net/man/1/tree
quelle
Wenn jemand interessiert ist, gibt diese rekursive Funktion eine verschachtelte Struktur von Wörterbüchern zurück. Schlüssel sind
file system
Namen (von Verzeichnissen und Dateien), Werte sind entweder:file_token
)Die Zeichenfolgen, die Dateien kennzeichnen, sind in diesem Beispiel leer. Sie können auch z. B. Dateiinhalte oder deren Eigentümerinformationen oder -berechtigungen oder ein anderes Objekt als ein Diktat erhalten. Sofern es sich nicht um ein Wörterbuch handelt, kann es in weiteren Vorgängen leicht von einem "Verzeichnis-Typ" unterschieden werden.
Einen solchen Baum in einem Dateisystem haben:
Das Ergebnis wird sein:
Wenn Ihnen das gefällt, habe ich bereits ein Paket (Python 2 & 3) mit diesem Zeug (und einem netten
pyfakefs
Helfer) erstellt: https://pypi.org/project/fsforge/quelle
Neben der obigen Antwort von dhobbs ( https://stackoverflow.com/a/9728478/624597 ) gibt es hier eine zusätzliche Funktion zum Speichern von Ergebnissen in einer Datei (ich persönlich verwende sie zum Kopieren und Einfügen in FreeMind , um einen schönen Überblick zu erhalten die Struktur, deshalb habe ich Tabulatoren anstelle von Leerzeichen zum Einrücken verwendet):
quelle
Sie können den Befehl 'tree' der Linux-Shell ausführen.
Installation:
Verwendung in Python
Beispiel:
Dies gibt Ihnen eine sauberere Struktur und ist visuell umfassender und einfach zu tippen.
quelle
Diese Lösung funktioniert nur, wenn Sie
tree
auf Ihrem System installiert haben . Ich lasse diese Lösung jedoch hier, nur für den Fall, dass sie jemand anderem hilft.Sie können tree anweisen, die Baumstruktur als XML (
tree -X
) oder JSON (tree -J
) auszugeben . JSON kann natürlich direkt mit Python analysiert werden und XML kann leicht mit gelesen werdenlxml
.Am Beispiel der folgenden Verzeichnisstruktur:
XML
JSON
quelle
Vielleicht schneller als @ellockie (Vielleicht)
Testergebnisse im folgenden Screenshot:
quelle
Hier finden Sie Code mit folgender Ausgabe: https://stackoverflow.com/a/56622847/6671330
quelle
Für diejenigen, die noch nach einer Antwort suchen. Hier ist ein rekursiver Ansatz, um die Pfade in einem Wörterbuch abzurufen.
quelle
@ dhobbs Antwort ist großartig!
aber ändern Sie einfach, um einfach die Level-Informationen zu erhalten
und die Ausgabe wie
Sie können das Level durch
|
Zählen erhalten!quelle