为了账号安全,请及时绑定邮箱和手机立即绑定

排除os.walk中的目录

排除os.walk中的目录

萧十郎 2019-12-20 10:39:26
我正在编写一个脚本,该脚本会下降到目录树中(使用os.walk()),然后访问与某个文件扩展名匹配的每个文件。然而,由于某些目录树,我的工具将被用于在还包含子目录,反过来包含的LOT无用的(这个脚本的目的)的东西,我想我会增加一个选项,为用户指定从遍历中排除的目录列表。使用os.walk()很简单。毕竟,由我来决定是我实际上是要访问os.walk()生成的相应文件/目录还是仅跳过它们。问题是,如果我有例如这样的目录树:root--     |     --- dirA     |     --- dirB     |     --- uselessStuff --                       |                       --- moreJunk                       |                       --- yetMoreJunk而且我想排除uselessStuff及其所有子项,os.walk()仍将进入uselessStuff的所有(可能成千上万个)子目录中,不用说,这会使事情减慢很多。在理想的世界中,我可以告诉os.walk()甚至不必费心再产生更多uselessStuff的子级,但是据我所知,没有办法这样做(是吗?)。有人有主意吗?也许有一个第三方库提供了类似的东西?
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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仅会递归到名称仍保留在目录名中的子目录;这可以用来修剪搜索...


查看完整回答
反对 回复 2019-12-20
?
侃侃无极

TA贡献2051条经验 获得超10个赞

... @ 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]


查看完整回答
反对 回复 2019-12-20
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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

查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 1199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号