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

5
我编写了一个图像切割脚本来帮助我的工作。该工具通过指定的扩展名进行图像切割,并与哈希数据库进行比较。
该工具用于搜索已挂载驱动器,其中一些驱动器上安装有操作系统。
我遇到的问题是,当驱动器被挂载上操作系统时,它会搜索“所有用户”目录,因此会包括来自我的本地磁盘的图像。
我无法弄清楚如何跳过“所有用户”目录,只保留已挂载的驱动器。
我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

非常感谢您的帮助


“所有用户”是目录的名称吗? - Anand S Kumar
抱歉,我想要跳过的路径始终是C:\ Users \ All Users。 - user3450524
2个回答

6
假设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

如果您只想在特定父目录中为所有用户All Users禁用步行,您可以在上述if条件中包含该检查。从os.walk文档中得知-生成目录树中的文件名,可以自上而下或自下而上遍历树。对于根目录为top的树中的每个目录(包括top本身),它会产生一个3元组(dirpath,dirnames,filenames)。当topdown为True时,调用者可以原地修改dirnames列表(可能使用del或切片赋值),并且walk()仅递归到其名称保留在dirnames中的子目录中;这可用于修剪搜索,强制执行特定的访问顺序,甚至通知walk()有关调用者在恢复walk()之前创建或重命名的目录。当topdown为False时修改dirnames是无效的,因为在自下而上模式下,在生成dirpath本身之前生成dirnames中的目录。

topdown通常为真,除非另有规定。


1
@adrianus 你有试过吗?它永远不会进入“所有用户”目录,也不会读取其中的任何文件或文件夹。 - Anand S Kumar
1
是的,我尝试过了,所有从被排除的目录中的文件仍然显示出来。 - adrianus
除非您的代码存在其他问题,否则不会发生这种情况。 - Anand S Kumar
当您从“subdirs”名称中删除目录时,它不会进入其中(遍历其中)。 - Anand S Kumar
真的很希望其他投反对票的人能够评论一下,为什么他们认为这不是一个好的解决方案。 - Anand S Kumar
显示剩余3条评论

2
如果您有多个要删除的目录,可以使用切片赋值来从subdirs中删除被排除的目录。最初的回答。
excl_dirs = {'All Users', 'some other dir'}

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

根据文档描述:
当设置topdownTrue时,调用者可以就地修改dirnames列表(可能使用 del或切片赋值),walk()仅会在名字在dirnames中的子目录中递归。

为什么必须这样写[:]? - greendino
@AbdullahSaid 添加了一些解释。此外:这是一个切片赋值;它会就地修改列表(即不会创建新列表)。 - hiro protagonist
感谢这个信息:当 topdown 为真时,调用者可以原地修改 dirnames 列表(可能使用 del 或切片赋值),walk() 将仅递归进入目录名仍然在 dirnames 中的子目录; - galian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接