7

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

必须有更有效的方法来做到这一点。有任何想法吗?

4

3 回答 3

20

你可以做这样的事情(假设你想忽略包含'.'的目录):

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

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

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

于 2012-05-16T14:41:23.387 回答
0

os.walk的 Python 文档中的这个示例可能会有所帮助。它自下而上(删除)工作。

# 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))

我对您的目标有点困惑,您是在尝试删除目录子树并遇到错误,还是您尝试遍历树并仅尝试列出简单的文件名(不包括目录名)?

于 2012-05-16T14:31:34.473 回答
0

我认为所需要的只是在迭代之前删除目录:

for root, subdirs, files in os.walk(directory, True):
        if '.' in subdirs:
            subdirs.remove('.')
        for subdir in subdirs:
            #do more stuff
于 2022-02-17T13:19:29.250 回答