Mir ist klar, dass es in der Frage nicht gestellt wurde, aber ich hatte ein ähnliches Problem, bei dem ich sowohl versteckte Dateien als auch Dateien ausschließen wollte, die mit __
beginnen , insbesondere __pycache__
Verzeichnisse. Ich bin auf diese Frage gelandet, weil ich versucht habe herauszufinden, warum mein Listenverständnis nicht das tut, was ich erwartet habe. Ich habe die vorhandene Liste nicht mit dirnames[:]
geändert .
Ich habe eine Liste von Präfixen erstellt, die ich ausschließen wollte, und die Verzeichnisse wie folgt geändert:
exclude_prefixes = ('__', '.') # exclusion prefixes
for dirpath, dirnames, filenames in os.walk(node):
# exclude all dirs starting with exclude_prefixes
dirnames[:] = [dirname
for dirname in dirnames
if not dirname.startswith(exclude_prefixes)]
Mein Anwendungsfall ähnelte dem von OP, außer dass ich eine Anzahl der Gesamtzahl der Unterverzeichnisse in einem bestimmten Ordner zurückgeben wollte. In meinem Fall wollte ich alle Unterverzeichnisse mit dem Namen .git
weglassen (sowie alle Ordner, die in diesen .git
verschachtelt sein können Ordner).
In Python 3.6.7 stellte ich fest, dass der Ansatz der akzeptierten Antwort nicht funktionierte – es wurden alle .git
gezählt Ordner und deren Unterordner. Folgendes hat bei mir funktioniert:
num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
if '.git' in dirs:
dirs.remove('.git')
num_local_subdir += (len(dirs))
Nein, es gibt keine Option für os.walk()
das überspringt diese. Sie müssen dies selbst tun (was ganz einfach ist):
for root, dirs, files in os.walk(path):
files = [f for f in files if not f[0] == '.']
dirs[:] = [d for d in dirs if not d[0] == '.']
# use files and dirs
Beachten Sie die dirs[:] =
Slice-Zuweisung; os.walk
durchläuft rekursiv die in dirs
aufgelisteten Unterverzeichnisse . Durch Ersetzen der Elemente von dirs
mit denen, die ein Kriterium erfüllen (z. B. Verzeichnisse, deren Namen nicht mit .
beginnen ), os.walk()
besucht keine Verzeichnisse, die die Kriterien nicht erfüllen.
Dies funktioniert nur, wenn Sie den topdown
beibehalten Schlüsselwortargument zu True
, aus der Dokumentation von os.walk()
:
Wenn topdown
ist True
, kann der Aufrufer die dirnames-Liste direkt ändern (vielleicht mit del
oder Slice-Zuweisung) und walk()
wird nur in die Unterverzeichnisse rekursiv, deren Namen in dirnames bleiben; Dies kann verwendet werden, um die Suche einzuschränken, eine bestimmte Besuchsreihenfolge festzulegen oder sogar walk()
zu informieren über Verzeichnisse, die der Aufrufer erstellt oder umbenennt, bevor er fortfährt walk()
nochmal.