Ходок Python, который может игнорировать каталоги - PullRequest
8 голосов
/ 29 мая 2009

Мне нужен обходчик файловой системы, который я мог бы проинструктировать игнорировать обход каталоги, которые я хочу оставить нетронутыми, включая все подкаталоги под этой веткой. Os.walk и os.path.walk просто не делают этого.

Ответы [ 4 ]

9 голосов
/ 29 мая 2009

На самом деле, os.walk может делать именно то, что вы хотите. Скажем, у меня есть список (возможно, набор) каталогов, которые нужно игнорировать в ignore. Тогда это должно работать:

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
7 голосов
/ 29 мая 2009

Возможно изменить второй элемент возвращаемых значений os.walk на месте:

[...] вызывающая сторона может изменить список dirnames на месте (возможно, используя назначение del или slice), а walk () вернется только в подкаталоги, имена которых остаются в dirnames; это может быть использовано для сокращения поиска [...]

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

Теперь вы можете просто передать предикат для подкаталогов:

>>> ignore_list = [...]
>>> list(fwalk("some/root", lambda r, d: d not in ignore_list))
2 голосов
/ 12 января 2012

Вот лучшее и простое решение.

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

Помните, что если вы удалите имя папки из dirs, оно не будет исследовано os.walk.

надеюсь, это поможет

1 голос
/ 29 мая 2009

Итак, я сделал эту функцию «Ходок с домашними ролями»:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...