Ich schreibe ein Skript, das in einen Verzeichnisbaum absteigt (mit os.walk ()) und dann jede Datei besucht, die einer bestimmten Dateierweiterung entspricht. Da jedoch einige der Verzeichnisbäume, für die mein Tool verwendet wird, auch Unterverzeichnisse enthalten, die wiederum eine Menge nutzloser (für den Zweck dieses Skripts) Materials enthalten, habe ich mir vorgenommen, eine Option hinzuzufügen, die der Benutzer angeben kann Eine Liste der Verzeichnisse, die vom Durchlauf ausgeschlossen werden sollen.
Dies ist mit os.walk () einfach genug. Schließlich liegt es an mir, zu entscheiden, ob ich die jeweiligen Dateien / Verzeichnisse von os.walk () tatsächlich besuchen oder einfach überspringen möchte. Das Problem ist, dass wenn ich zum Beispiel einen Verzeichnisbaum wie diesen habe:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
und ich möchte nutzloses Zeug und alle seine Kinder ausschließen, os.walk () wird immer noch in alle (möglicherweise Tausende von) Unterverzeichnissen von nutzlosem Zeug absteigen , was natürlich die Dinge sehr verlangsamt. In einer idealen Welt könnte ich os.walk () anweisen, sich nicht einmal mehr die Mühe zu machen, Kinder von nutzlosem Zeug zur Welt zu bringen , aber meines Wissens gibt es keine Möglichkeit, dies zu tun (gibt es?).
Hat jemand eine Idee? Vielleicht gibt es eine Drittanbieter-Bibliothek, die so etwas bietet?
dirs[:] =
?dirs[:] = value
ändertdirs
an Ort und Stelle . Es ändert den Inhalt der Liste,dirs
ohne den Container zu ändern. Wie bereitshelp(os.walk)
erwähnt, ist dies erforderlich, wenn Sie die Art und Weise beeinflussen möchten, wieos.walk
die Unterverzeichnisse durchlaufen werden. (dirs = value
dirs
dirs
filter()
:dirs[:] = list(filter(lambda x: not x in exclude, dirs))
os.walk
und nachgibt,root, dirs, files
nachdem Sie ausgeschlossen haben.git
(oder was auch immer Sie wünschen)dirs
.... eine alternative Form von @ unutbu ist eine ausgezeichnete Antwort , die ein wenig direkt gegeben mehr liest, dass die Absicht ist ausschließen Verzeichnisse, auf Kosten von O (n ** 2) vs O (n) Zeit.
(
list(dirs)
Für die korrekte Ausführung ist eine Kopie der Verzeichnisliste mit erforderlich.)quelle
dirs[:] = set(dirs) - exclude
. Zumindest ist es immer noch \ $ O (n) \ $ und Sie bauen nicht nur ein Verständnis für seine Nebenwirkungen auf ...