不进入特定文件夹的Python walker
这是我的第一篇帖子,所以要温柔 问题:我希望能够使用os.walk作为目录漫游器,但不能进入某些文件夹。例: 树: 我想显示项目和加载,但不想显示加载下的子目录。我可以使用下面的代码来实现这一点不进入特定文件夹的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: "
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)