Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地从os.walk中删除目录名中的子目录_Python_Python 2.7_Os.walk - Fatal编程技术网

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

Python 有效地从os.walk中删除目录名中的子目录,python,python-2.7,os.walk,Python,Python 2.7,Os.walk,在Python2.7的mac上,当使用os.walk遍历目录时,我的脚本会遍历“apps”,即appname.app,因为这些实际上只是它们自己的目录。稍后在处理过程中,我在处理错误时会遇到错误。无论如何,我都不想看它们,所以出于我的目的,最好忽略这些类型的“目录” 这就是我目前的解决方案: for root, subdirs, files in os.walk(directory, True): for subdir in subdirs: if '.' in subd

在Python2.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的每次迭代中运行,这是不必要的,因为第一次循环删除了我想要删除的所有内容


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

也许来自的这个例子会有所帮助。它自下而上工作(删除)


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

您可以这样做(假设您要忽略包含“.”的目录):

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


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

问题在于不遍历某些目录,而不是删除它们。@interjay Oops。。我被问题中的“删除子目录”所吸引,我将根据需要重新阅读并更新问题。谢谢你指出这一点。@Levon我在删除任何内容时没有遇到错误。实际上,我正在做的是构建一个同步应用程序(对于我自己的个人学习,我知道已经存在这样的程序),从目标获取数据并将其复制到源。我在复制过程中遇到问题,说文件不存在,尽管我已经完成了查找文件的过程。只有当进程使用.app扩展名(MAC)处理文件夹时,才会发生这种情况。既然我不想复制这些,我认为删除这些类型的文件夹是最好的。对于那些不了解此功能的人:从
os.walk
返回的
subdirs
列表中删除目录会导致
os.walk
不会递归到该目录中。os.walk的工作方式不会迭代到从列表中删除的子目录中,所以我不明白你为什么这么担心!这就是为什么我认为自下而上不适合我。我在我的例子中所做的正是我想做的,正如马克·兰瑟姆所说的那样;我只是问是否有更有效的方法来实现这一点,因为for循环将对我将要迭代的每个有效子目录重复;对我来说,这似乎效率低下,尽管对性能影响不大。我的问题实际上围绕着最佳实践应该是什么样子。是吗?@Mark Ransom,我只关心这样一个事实,即第二个for循环将在有效子曲面的每次迭代中进行。这将在子曲面中剩余部分的每次迭代中运行,尽管正确吗?因为这将被放置在第一个for循环的下面?是的,刚刚确认它确实会对仍将要处理的每个子目录进行迭代。@PatrickBateman:它必须对每个目录执行,因为每个目录都有不同的子目录。哦,我明白了,我也可以显示出来!这看起来比我做的好多了。
# 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))
subdirs[:] = [d for d in subdirs if '.' not in d]