排除操作系统中的目录。

2024-05-14 21:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,该脚本将下降到目录树中(使用os.walk()),然后访问与某个文件扩展名匹配的每个文件。但是,由于我的工具将要使用的一些目录树还包含子目录,这些子目录又包含一批无用的(在本脚本中)内容,我想我应该为用户添加一个选项,以指定要从遍历中排除的目录列表。

使用os.walk()这很容易。毕竟,由我来决定是否真的要访问os.walk()生成的相应文件/目录,或者直接跳过它们。问题是,例如,如果我有这样的目录树:

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

我想排除uselessStuff,它的所有子目录os.walk()仍然会下降到uselessStuff的所有子目录(可能有数千个子目录),这不必说会大大减慢速度。在一个理想的世界中,我可以告诉os.walk()甚至不必再费心让更多的孩子成为无用的垃圾,但据我所知,这是没有办法的(是吗?)。

有人知道吗?也许有第三方图书馆提供类似的服务?


Tags: 文件工具用户目录脚本内容列表os
2条回答

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

在适当位置修改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):

When topdown is true, the caller can modify the dirnames list in-place (e.g., via del or slice assignment), and walk will only recurse into the subdirectories whose names remain in dirnames; this can be used to prune the search...

相关问题 更多 >

    热门问题