首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个可以忽略目录的Python walker

一个可以忽略目录的Python walker
EN

Stack Overflow用户
提问于 2009-05-29 08:52:47
回答 4查看 6.1K关注 0票数 8

我需要一个文件系统遍历程序,我可以指示它忽略遍历的目录,包括该分支下的所有子目录。os.walk和os.path.walk就是不这样做。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-29 08:59:52

所以我做了这个家庭角色遍历函数:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2009-05-29 10:06:40

实际上,os.walk可能会做您想要做的事情。假设我在ignore中有一个要忽略的目录列表(可能是一组)。那么这应该是可行的:

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2009-05-29 10:05:38

可以就地修改os.walk返回值的第二个元素:

...调用者可以就地修改目录名称列表(可能使用del或slice赋值),walk()将只递归到其名称保留在目录名称中的子目录中;这可以用于修剪搜索...

代码语言:javascript
复制
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

现在,您只需为子目录提交一个谓词:

代码语言:javascript
复制
>>> ignore_list = [...]
>>> list(fwalk("some/root", lambda r, d: d not in ignore_list))
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/925056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档