使用os.walk在过滤器中导航特定的目录

时间:2015-09-29 14:28:48

标签: python os.walk

我知道我可以使用

中的内容从os.walk中删除目录
for root, dirs, files in os.walk('/path/to/dir'):
    ignore = ['dir1', 'dir2']
    dirs[:] = [d for d in dirs if d not in ignore]

我想做与此相反的事情,所以只保留dirs列表。我尝试了一些变化但无济于事。任何指针都会受到赞赏。

我感兴趣的目标是2级,所以我接受了评论并为子级别创建了全局变量,并使用了以下代码。

预期功能

for root, dirs, files in os.walk(global_subdir):
keep = ['dir1', 'dir2']
dirs[:] = [d for d in dirs if d in keep]
for filename in files:
    print os.path.join(root, filename)

1 个答案:

答案 0 :(得分:1)

如删除答案的评论所述 -

  

如上所述,这不起作用。保持的目标是2级子根。我猜这是导致问题

问题是,由于不在您的keep列表中,因此不会遍历所需目录上一级目录,因此程序永远不会到达您所需的目录。

解决此问题的最佳方法是在距您所需目录高一级的目录中启动os.walk

但是如果这是不可能的(例如,在遍历之前可能不知道所需目录之上的目录)或者(所需目录具有上面一级的不同目录)。而你真正想要的是避免循环访问不在keep目录中的目录的文件。

解决方案是遍历所有目录,但仅当files列在root列表中时才循环遍历keep(或设置为更好的性能)。示例 -

keep = set(['required directory1','required directory2'])
for root, dirs, files in os.walk(global_subdir):
    if root in keep:
        for filename in files:
            print os.path.join(root, filename)