在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循环将针对每个子目录的迭代运行,这是不必要的,因为第一遍除去了我想要删除的所有内容。
必须有一种更有效的方法来做到这一点。有什么想法吗?
答案 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))
我对你的目标感到有点困惑,你是试图删除一个目录子树并遇到错误,还是你试图走一棵树而只是试图列出简单的文件名(不包括目录名)?