排除os.walk中的目录

我正在编写一个脚本,下载到目录树(使用os.walk()),然后访问每个文件匹配一个特定的文件扩展名。 然而,由于我的工具将使用的一些目录树还包含子目录,而这些子目录又包含很多无用的东西(出于此脚本的目的),所以我想为用户添加一个选项来指定从遍历中排除的目录列表。

os.walk()很简单。 毕竟,我决定是否真的要访问os.walk()产生的文件/目录,或者跳过它们。 问题是,如果我有,像这样的目录树:

root-- | --- dirA | --- dirB | --- uselessStuff -- | --- moreJunk | --- yetMoreJunk 

我想排除uselessStuff及其所有的子元素 ,os.walk()仍然会下降到所有可能的成千上万的无用的元素目录中,毫无疑问 ,这会降低很多。 在一个理想的世界里,我可以告诉os.walk()甚至不会让更多的无用的stuffed成为孩子,但据我所知,没有办法做到这一点(是吗?)。

有没有人有一个想法? 也许有一个第三方库提供类似的东西?

修改dirs 就地将修剪由os.walk访问的(后续)文件和目录:

 # exclude = set([...]) for root, dirs, files in os.walk(top, topdown=True): dirs[:] = [d for d in dirs if d not in exclude] 

从帮助(os.walk):

当topdown为true时,调用者可以就地修改dirnames列表(例如,通过del或slice赋值),walk只会recursion到名称保持dirnames的子目录中; 这可以用来修剪search…

… @ unutbu的优秀答案的另一种forms,读取更直接一点,因为其目的是以O(n ** 2)与O(n)时间为代价排除目录。

(为了正确执行,使用list(dirs)复制dirs列表是必需的)

 # exclude = set([...]) for root, dirs, files in os.walk(top, topdown=True): [dirs.remove(d) for d in list(dirs) if d in exclude]