一个可以忽略目录的Python walker

时间:2009-05-29 08:52:47

标签: python directory-walk ignore-files

我需要一个文件系统walker,我可以指示忽略遍历 我想保持不变的目录,包括所有子目录 在那个分支下面。 os.walk和os.path.walk就是不这样做。

4 个答案:

答案 0 :(得分:9)

实际上,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

答案 1 :(得分:7)

可以就地修改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 :(得分:2)

这是最好和最简单的解决方案。

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进行探索。

希望有所帮助

答案 3 :(得分:1)

所以我做了这个家庭角色助行器功能:

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