不进入特定文件夹的Python walker

不进入特定文件夹的Python walker,python,recursion,directory,ignore-files,Python,Recursion,Directory,Ignore Files,这是我的第一篇帖子,所以要温柔 问题:我希望能够使用os.walk作为目录漫游器,但不能进入某些文件夹。例: 树: 我想显示项目和加载,但不想显示加载下的子目录。我可以使用下面的代码来实现这一点 import os for root, subFolders, files in os.walk('.'): # root does NOT contain 'Load' if root.find('Load') == -1: print "\nPROJECT: "

这是我的第一篇帖子,所以要温柔

问题:我希望能够使用os.walk作为目录漫游器,但不能进入某些文件夹。例:

树:

我想显示项目和加载,但不想显示加载下的子目录。我可以使用下面的代码来实现这一点

import os


for root, subFolders, files in os.walk('.'):
    # root does NOT contain 'Load'
    if root.find('Load') == -1:
        print "\nPROJECT: " + root + "\n"
        for folder in subFolders:
            print "    " + folder
然而,列表是一个很大的列表,所以我尝试使用del-to,但无法使其正常工作,使用列表也是一样,例如(我从这里的另一篇文章中获得):


但是我也不能让它正常工作。我是Python新手,非常感谢您的帮助。谢谢

您可以尝试以下操作:

for x in os.walk('.', topdown=True):
    dirpath, dirnames, dirfiles = x
    print(dirpath, dirnames)
    dirnames[:] = filter(lambda x : not x.startswith('Load'), dirnames)
帮助(os.walk)
,如果
自上而下
,您可以修改
名称
,以限制搜索。

尝试:

    dirnames[:] = [
        dn for dn in dirnames
        if ignore not in os.path.join(dirpath, dn)]
您希望将目录保留在
os.path.join(dirpath,dn)
不包含字符串
ignore
的位置


顺便说一下,您可以在作业的左侧使用
dirnames[:]
。要删除os.walk访问的目录,您必须修改相同的列表
dirnames

dirnames[:]=…
就地修改相同的列表。
dirnames=…
会将名称
dirnames
重定向到不同的值。

顺便说一句,这就是我最后得到的

import os,string
path = '.'
path = os.path.normpath(path)
res = []

for root,dirs,files in os.walk(path, topdown=True):
    depth = root[len(path) + len(os.path.sep):].count(os.path.sep)
    if depth == 2:
        # We're currently two directories in, so all subdirs have depth 3
        res += [os.path.join(root, d) for d in dirs]
        dirs[:] = [] # Don't recurse any deeper
print(res)

我知道这是一篇老文章,但我想我应该用我的答案更新它。以防万一,其他人都会觉得它很有用。

欢迎使用StackOverflow!首先,它怎么不起作用?它不会忽略文件夹吗?在
ignore
中你给出了什么参数?我想函数os.listdir(..)应该满足你的需要:)哇。。。
dirnames[:]=…
在做什么??我知道,
dirnames[:]
复制一份列表,但是假设它不应该在
=
的左侧,等等,你说“然而,列表是一个大列表…”是什么意思?你原来的代码有什么问题?很抱歉没有更好地解释“大列表”。我的意思是顶层代码工作正常。但是,由于它一直在遍历所有的子曲面,甚至是我不希望它遍历的子曲面,所以需要花费很长时间。因此,为什么我要使用我可以修改的列表…第二种方法。我会看看下面的答案,让大家知道我最终得到了什么。
    dirnames[:] = [
        dn for dn in dirnames
        if ignore not in os.path.join(dirpath, dn)]
import os,string
path = '.'
path = os.path.normpath(path)
res = []

for root,dirs,files in os.walk(path, topdown=True):
    depth = root[len(path) + len(os.path.sep):].count(os.path.sep)
    if depth == 2:
        # We're currently two directories in, so all subdirs have depth 3
        res += [os.path.join(root, d) for d in dirs]
        dirs[:] = [] # Don't recurse any deeper
print(res)