排除os.walk中的目录

我正在编写一个脚本,该脚本会下降到目录树中(使用os.walk()),然后访问与某个文件扩展名匹配的每个文件。然而,由于某些目录树,我的工具将被用于在还包含子目录,反过来包含的LOT无用的(这个脚本的目的)的东西,我想我会增加一个选项,为用户指定从遍历中排除的目录列表。


使用os.walk()很简单。毕竟,由我来决定是我实际上是要访问os.walk()生成的相应文件/目录还是仅跳过它们。问题是,如果我有例如这样的目录树:


root--

     |

     --- dirA

     |

     --- dirB

     |

     --- uselessStuff --

                       |

                       --- moreJunk

                       |

                       --- yetMoreJunk

而且我想排除uselessStuff及其所有子项,os.walk()仍将进入uselessStuff的所有(可能成千上万个)子目录中,不用说,这会使事情减慢很多。在理想的世界中,我可以告诉os.walk()甚至不必费心再产生更多uselessStuff的子级,但是据我所知,没有办法这样做(是吗?)。


有人有主意吗?也许有一个第三方库提供了类似的东西?


萧十郎
浏览 986回答 3
3回答

繁星淼淼

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时,调用者可以就地修改目录名列表(例如,通过del或slice分配),而walk仅会递归到名称仍保留在目录名中的子目录;这可以用来修剪搜索...

侃侃无极

... @ unutbu的出色答案的另一种形式,它的读入更为直接,因为其目的是排除目录,所花费的时间为O(n ** 2)vs 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]

慕盖茨4494581

就地dirs[:] = value修改。它在不更改容器的情况下更改列表的内容。如前所述,如果您希望影响遍历子目录的方式,则需要这样做。(仅将变量重新分配(或“绑定”)到新列表,而无需修改原始列表。)dirs dirshelp(os.walk)os.walkdirs = valuedirsdirs
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python