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

时间:2012-05-16 14:30:07

标签: python python-2.7 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循环将针对每个子目录的迭代运行,这是不必要的,因为第一遍除去了我想要删除的所有内容。

必须有一种更有效的方法来做到这一点。有什么想法吗?

2 个答案:

答案 0 :(得分:17)

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

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

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

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

答案 1 :(得分:0)

也许Python docs for os.walk中的这个示例会有所帮助。它从下往上工作(删除)。

# Delete everything reachable from the directory named in "top",
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))

我对你的目标感到有点困惑,你是试图删除一个目录子树并遇到错误,还是你试图走一棵树而只是试图列出简单的文件名(不包括目录名)?