有效地从os.walk中删除目录名中的子目录


问题内容

在python 2.7中的Mac上,使用os.walk浏览目录时,我的脚本会通过“
apps”即appname.app,因为它们实际上只是它们自己的目录。后来在处理过程中,我遇到错误时遇到了错误。无论如何我都不想遍历它们,因此出于我的目的,最好只是忽略那些类型的“目录”。

所以这是我目前的解决方案:

for root, subdirs, files in os.walk(directory, True):
    for subdir in subdirs:
        if '.' in subdir:
            subdirs.remove(subdir)
    #do more stuff

如您所见,第二个for循环将在子目录的每次迭代中运行,这是不必要的,因为第一遍将删除我想删除的所有内容。

必须有一种更有效的方法来执行此操作。有任何想法吗?


问题答案:

您可以执行以下操作(假设您要忽略包含“。”的目录):

subdirs[:] = [d for d in subdirs if '.' not in d]

切片分配(而不是subdirs = ...)是必要的,因为您需要修改os.walk正在使用的同一列表,而不是创建新列表。

请注意,您的原始代码不正确,因为您在迭代列表时修改了列表,这是不允许的。