如何跳过os walk Python 2.7中的目录

时间:2015-07-16 08:58:01

标签: python python-2.7 os.walk

我写了一个图像雕刻脚本来协助我的工作。该工具通过指定的扩展来雕刻图像,并与哈希数据库进行比较。

该工具用于搜索已安装的驱动器,其中一些驱动器具有操作系统。

我遇到的问题是当驱动器安装了操作系统时,它会搜索“所有用户”目录,因此包含来自我本地光盘的图像。

我无法弄清楚如何跳过“所有用户”目录并坚持使用已安装的驱动器。

我对os.walk的部分如下:

for path, subdirs, files in os.walk(root):
    for name in files:
        if re.match(pattern, name.lower()):
                appendfile.write (os.path.join(path, name))
                appendfile.write ('\n')
                log(name)
                i=i+1

非常感谢任何帮助

2 个答案:

答案 0 :(得分:5)

假设All Users是目录的名称,您可以从subdirs列表中删除该目录,以便os.walk()不会对其进行迭代。

示例 -

for path, subdirs, files in os.walk(root):
    if 'All Users' in subdirs:
        subdirs.remove('All Users')
    for name in files:
        if re.match(pattern, name.lower()):
                appendfile.write (os.path.join(path, name))
                appendfile.write ('\n')
                log(name)
                i=i+1

如果您只想在特定父级中不在<{1}}内进行,则可以在上述All Users条件中包含对该问题的检查。

来自os.walk documentation -

  

os.walk(top,topdown = True,onerror = None,followlinks = False)

     

通过从上到下或从下到上走树来生成目录树中的文件名。对于以目录top(包括top本身)为根的树中的每个目录,它会产生一个3元组(dirpath,dirnames,filenames)。

     

当topdown为True时,调用者可以就地修改dirnames列表(可能使用del或slice赋值),而walk()只会递归到名称保留在dirnames中的子目录中;这可用于修剪搜索,强制执行特定的访问顺序,甚至可以告诉walk()有关调用者在再次恢复walk()之前创建或重命名的目录。当topdown为False时修改dirnames是无效的,因为在自下而上模式中,dirnames中的目录是在生成dirpath本身之前生成的。

if通常是正确的,除非另有说明。

答案 1 :(得分:0)

如果要删除的目录不止一个,则可以在oder中使用切片分配删除subdirs

中排除的目录
excl_dirs = set(('All Users', 'some other dir'))

for path, subdirs, files in os.walk(root):
    subdirs[:] = [d for d in subdirs if d not in excl_dirs]
    ...