os.walk没有挖入下面的目录

如何限制os.walk只返回我提供的目录中的文件?

 def _dir_list(self, dir_name, whitelist): outputList = [] for root, dirs, files in os.walk(dir_name): for f in files: if os.path.splitext(f)[1] in whitelist: outputList.append(os.path.join(root, f)) else: self._email_to_("ignore") return outputList 

使用walklevelfunction。

 import os def walklevel(some_dir, level=1): some_dir = some_dir.rstrip(os.path.sep) assert os.path.isdir(some_dir) num_sep = some_dir.count(os.path.sep) for root, dirs, files in os.walk(some_dir): yield root, dirs, files num_sep_this = root.count(os.path.sep) if num_sep + level <= num_sep_this: del dirs[:] 

它就像os.walk一样工作,但是可以传递一个level参数来指示recursion有多深。

不要使用os.walk。

例:

 import os root = "C:\\" for item in os.listdir(root): if os.path.isfile(os.path.join(root, item)): print item 

我认为解决scheme其实很简单。

使用

 break 

只做for循环的第一次迭代,必须有一个更优雅的方式。

 for root, dirs, files in os.walk(dir_name): for f in files: ... ... break ... 

第一次调用os.walk时,它会返回当前目录的郁金香,然后在下一个循环中返回下一个目录的内容。

拿原来的脚本,只是添加一个rest

 def _dir_list(self, dir_name, whitelist): outputList = [] for root, dirs, files in os.walk(dir_name): for f in files: if os.path.splitext(f)[1] in whitelist: outputList.append(os.path.join(root, f)) else: self._email_to_("ignore") break return outputList 

build议使用listdir是一个很好的build议。 直接回答你的问题是root, dirs, files = os.walk(dir_name).next()

如果你有更复杂的需求而不仅仅是顶层目录(比如忽略VCS目录等),你也可以修改目录列表来防止os.walkrecursion遍历它们。

即:

 def _dir_list(self, dir_name, whitelist): outputList = [] for root, dirs, files in os.walk(dir_name): dirs[:] = [d for d in dirs if is_good(d)] for f in files: do_stuff() 

注意 – 小心改变列表,而不是仅仅重新绑定它。 os.walk显然不知道外部重新绑定。

你可以使用os.listdir() ,它返回给定目录中的名称列表(对于文件和目录)。 如果您需要区分文件和目录,请在每个名称上调用os.stat()

listdir相同的想法,但更短:

 [f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))] 
 for path, dirs, files in os.walk('.'): print path, dirs, files del dirs[:] # go only one level deep 

在Python 3中,我能够做到这一点:

 import os dir = "/path/to/files/" #List all files immediately under this folder: print ( next( os.walk(dir) )[2] ) #List all folders immediately under this folder: print ( next( os.walk(dir) )[1] ) 

感觉像扔我的2便士。

 baselevel = len(rootdir.split("\\")) for subdirs, dirs, files in os.walk(rootdir): curlevel = len(subdirs.split("\\")) if curlevel <= baselevel + 1: [do stuff] 

您也可以执行以下操作:

 for path, subdirs, files in os.walk(dir_name): for name in files: if path == ".": #this will filter the files in the current directory #code here 

这就是我解决它的方法

 if recursive: items = os.walk(target_directory) else: items = [next(os.walk(target_directory))] ... 

使用listdir时有一个问题。 os.path.isdir(标识符)必须是绝对path。 要select子目录,请执行以下操作:

 for dirname in os.listdir(rootdir): if os.path.isdir(os.path.join(rootdir, dirname)): print("I got a subdirectory: %s" % dirname) 

另一种方法是在不使用os.path.join()的情况下切换到目录进行testing。

你可以使用这个片段

 for root, dirs, files in os.walk(directory): if level > 0: # do some stuff else: break level-=1