8 Stimmen

Ein Python-Walker, der Verzeichnisse ignorieren kann

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.

9voto

Rick Copeland Punkte 11282

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

7voto

Torsten Marek Punkte 78610

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))

2voto

Ali Punkte 287

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

1voto

Johan Carlsson Punkte 703

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

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