我知道我可以使用
中的内容从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)
答案 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)