文章来自《Python cookbook》.

翻译仅仅是为了个人学习,其它商业版权纠纷与此无关!

@.84@ [DateTime(2004-09-27T09:11:33Z)] TableOfContents

描述

...Walking Directory Trees

遍历目录树

Credit: Robin Parmar, Alex Martelli

问题 Problem

You need to examine a directory, or an entire directory tree rooted in a certain directory, and obtain a list of all the files (and optionally folders) that match a certain pattern.

需要遍历检查目录, 或者遍历以某目录为根目录的完整的目录树,获取符合特定模式的全部文件(或者符合条件的目录).

解决 Solution

os.path.walk is sufficient for this purpose, but we can pretty it up quite at bit:

使用os.path.walk足够解决这个问题,不过可以做的更好些:

   1 import os.path, fnmatch
   2 
   3 def listFiles(root, patterns='*', recurse=1, return_folders=0):
   4 
   5     # Expand patterns from semicolon-separated string to list           
   6     pattern_list = patterns.split(';')
   7     # Collect input and output arguments into one bunch
   8     class Bunch:
   9         def _ _init_ _(self, **kwds): self._ _dict_ _.update(kwds)
  10     arg = Bunch(recurse=recurse, pattern_list=pattern_list,
  11         return_folders=return_folders, results=[])
  12 
  13     def visit(arg, dirname, files):
  14         # Append to arg.results all relevant files (and perhaps folders)
  15         for name in files:
  16             fullname = os.path.normpath(os.path.join(dirname, name))
  17             if arg.return_folders or os.path.isfile(fullname):
  18                 for pattern in arg.pattern_list:
  19                     if fnmatch.fnmatch(name, pattern):
  20                         arg.results.append(fullname)
  21                         break
  22         # Block recursion if recursion was disallowed
  23         if not arg.recurse: files[:]=[]
  24 
  25     os.path.walk(root, visit, arg)
  26 
  27     return arg.results

讨论 Discussion

The standard directory-tree function os.path.walk is powerful and flexible, but it can be confusing to beginners. This recipe dresses it up in a listFiles function that lets you choose the root folder, whether to recurse down through subfolders, the file patterns to match, and whether to include folder names in the result list.

The file patterns are case-insensitive but otherwise Unix-style, as supplied by the standard fnmatch module, which this recipe uses. To specify multiple patterns, join them with a semicolon. Note that this means that semicolons themselves can't be part of a pattern.

For example, you can easily get a list of all Python and HTML files in directory /tmp or any subdirectory thereof:

thefiles = listFiles('/tmp', '*.py;*.htm;*.html')

参考 See Also

Documentation for the os.path module in the Library Reference.