611 Stimmen

Verzeichnisbaum-Liste in Python

Wie erhalte ich eine Liste aller Dateien (und Verzeichnisse) in einem bestimmten Verzeichnis in Python?

2 Stimmen

Rekursiv oder nicht? Bitte klären Sie das. Für nicht rekursive Lösungen siehe: stackoverflow.com/questions/973473/

636voto

Jerub Punkte 40038

Auf diese Weise können Sie alle Dateien und Verzeichnisse in einem Verzeichnisbaum durchsuchen:

import os

for dirname, dirnames, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        print(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        print(os.path.join(dirname, filename))

    # Advanced usage:
    # editing the 'dirnames' list will stop os.walk() from recursing into there.
    if '.git' in dirnames:
        # don't go into any .git directories.
        dirnames.remove('.git')

19 Stimmen

Und wenn Sie diesen Code (so wie er ist) in der Python-Shell ausführen, denken Sie daran, dass Strg+C die Ausgabe in der Shell anhält ;)

41 Stimmen

Dies wird rekursiv Dateien und Verzeichnisse auflisten

0 Stimmen

Sie können sogar die Liste der Verzeichnisnamen bearbeiten, um zu verhindern, dass bestimmte Pfade immer wieder aufgerufen werden.

544voto

rslite Punkte 77347

Sie können verwenden

os.listdir(path)

Eine Referenz und weitere os-Funktionen finden Sie hier:

2 Stimmen

Nun, die ursprüngliche Frage ist so vage, dass man nicht weiß, ob eine rekursive Lösung gewünscht wird. "alle Dateien in einem Verzeichnis" könnte als rekursiv interpretiert werden.

3 Stimmen

@Tommy, ein "Verzeichnis" ist eine klar definierte Datenstruktur, und es bezieht sich auf "ls" und nicht auf "ls -R". Außerdem arbeiten fast alle UNIX-Tools standardmäßig nicht rekursiv. Ich weiß nicht, was der Fragesteller bedeutete sondern was er schrieb war klar.

3 Stimmen

Die Python 3-Dokumente sagen, dass Sie verwenden os.scandir zu verwenden, da Sie damit in vielen Fällen Systemaufrufe vermeiden können, was zu einer kostenlosen Beschleunigung führt (sowohl IPC als auch IO sind langsam).

135voto

giltay Punkte 1925

Hier ist eine Hilfsfunktion, die ich sehr oft verwende:

import os

def listdir_fullpath(d):
    return [os.path.join(d, f) for f in os.listdir(d)]

6 Stimmen

Ein Generator wäre besser.

3 Stimmen

@RobertSiemer das hängt von der Verwendung ab. In vielen Fällen wäre eine Liste besser, aber ich denke, ein Generator ist vielseitiger, da er in eine Liste umgewandelt werden kann. Es kommt darauf an, ob Sie nach Vielseitigkeit oder nach einer etwas schlankeren Lösung suchen.

4 Stimmen

Es ist zwar schon zehn Jahre her, aber ich glaube, ich habe es so gemacht, weil os.listdir() eine Liste zurückgibt und ich das imitieren wollte.

82voto

curtisk Punkte 19336
import os

for filename in os.listdir("C:\\temp"):
    print  filename

18 Stimmen

r'C:\temp' ist klarer und vorzuziehen gegenüber "C:\\temp" Rawstrings sind der Verwendung von Backslashes vorzuziehen.

1 Stimmen

@smci: Eigentlich "C:/temp" ist das, was vorzuziehen wäre.

0 Stimmen

@martineau: es gibt keinen Konsens; das ist wie emacs-vs-vi. Forward-slash ist vorzuziehen, weil es nicht als Escaping-Zeichen fehlinterpretiert werden kann, aber backward-slash ist immer noch beliebter...

15voto

kenny Punkte 3209

Wenn Sie Globbing-Fähigkeiten benötigen, gibt es auch dafür ein Modul. Zum Beispiel:

import glob
glob.glob('./[0-9].*')

wird etwas wie zurückgeben:

['./1.gif', './2.txt']

Siehe die Dokumentation aquí .

0 Stimmen

Das ist wirklich genial! können Sie Negation in diesen übereinstimmenden Ausdruck haben? wie alles außer Dateien übereinstimmenden THIS Muster?

0 Stimmen

@CharlieParker: Du kannst es nicht direkt mit glob aber man kann ziemlich leicht mit ihm oder os.listdir() in Verbindung mit dem re Modul für reguläre Ausdrücke - siehe diese Antwort zu einer anderen Frage.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X