Ich brauche einen Dateisystem-Walker, den ich anweisen kann, das Durchlaufen von Verzeichnisse zu ignorieren, die ich unberührt lassen möchte, einschließlich aller Unterverzeichnisse unterhalb dieses Zweigs. Das os.walk und os.path.walk tun es einfach nicht.
Antworten
Zu viele Anzeigen?Eigentlich, os.walk
kann genau das tun, was Sie wollen. Nehmen wir an, ich habe eine Liste (vielleicht eine Menge) von Verzeichnissen, die ich ignorieren soll in ignore
. Dann sollte das funktionieren:
def my_walk(top_dir, ignore):
for dirpath, dirnames, filenames in os.walk(top_dir):
dirnames[:] = [
dn for dn in dirnames
if os.path.join(dirpath, dn) not in ignore ]
yield dirpath, dirnames, filenames
Es ist möglich, das zweite Element von os.walk
Rückgabewerte an Ort und Stelle:
[...] der Aufrufer kann die dirnames-Liste an Ort und Stelle ändern (z.B. mit del oder slice assignment), und walk() rekursiert nur in die Unterverzeichnisse, deren Namen in dirnames verbleiben; dies kann dazu verwendet werden, die Suche zu beschneiden [...]
def fwalk(root, predicate):
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [d for d in dirnames if predicate(r, d)]
yield dirpath, dirnames, filenames
Jetzt können Sie einfach ein Prädikat für Unterverzeichnisse eingeben:
>>> ignore_list = [...]
>>> list(fwalk("some/root", lambda r, d: d not in ignore_list))
Hier ist die beste und einfachste Lösung.
def walk(ignores):
global ignore
path = os.getcwd()
for root, dirs, files in os.walk(path):
for ignore in ignores:
if(ignore in dirs):
dirs.remove(ignore)
print root
print dirs
print files
walk(['.git', '.svn'])
Denken Sie daran, wenn Sie den Ordnernamen aus dirs entfernen, wird er von os.walk nicht erkundet.
Ich hoffe, es hilft
Also habe ich diese Funktion für den Heimweg entwickelt:
import os
from os.path import join, isdir, islink, isfile
def mywalk(top, topdown=True, onerror=None, ignore_list=('.ignore',)):
try:
# Note that listdir and error are globals in this module due
# to earlier import-*.
names = os.listdir(top)
except Exception, err:
if onerror is not None:
onerror(err)
return
if len([1 for x in names if x in ignore_list]):
return
dirs, nondirs = [], []
for name in names:
if isdir(join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
if topdown:
yield top, dirs, nondirs
for name in dirs:
path = join(top, name)
if not islink(path):
for x in mywalk(path, topdown, onerror, ignore_list):
yield x
if not topdown:
yield top, dirs, nondirs