2009-05-29 132 views

回答

1

所以我做了这个家庭的角色沃克功能:

import os 
from os.path import join, isdir, islink, isfile 

def mywalk(top, topdown=True, onerror=None, ignore_list=('.ignore',)): 
    try: 
     # Note that listdir and error are globals in this module due 
     # to earlier import-*. 
     names = os.listdir(top) 
    except Exception, err: 
     if onerror is not None: 
      onerror(err) 
     return 
    if len([1 for x in names if x in ignore_list]): 
     return 
    dirs, nondirs = [], [] 
    for name in names: 
     if isdir(join(top, name)): 
      dirs.append(name) 
     else: 
      nondirs.append(name) 

    if topdown: 
     yield top, dirs, nondirs 
    for name in dirs: 
     path = join(top, name) 
     if not islink(path): 
      for x in mywalk(path, topdown, onerror, ignore_list): 
       yield x 
    if not topdown: 
     yield top, dirs, nondirs 
7

它可以修改就地os.walk的返回值的第二个元素:

[...]调用者可以就地修改dirnames列表(可能使用del或slice赋值),而walk()只会递归到名称保留在dirnames中的子目录中;这可以用来修剪搜索[...]现在

def fwalk(root, predicate): 
    for dirpath, dirnames, filenames in os.walk(root): 
     dirnames[:] = [d for d in dirnames if predicate(r, d)] 
     yield dirpath, dirnames, filenames 

,您可以在子目录谓词只手:

>>> ignore_list = [...] 
>>> list(fwalk("some/root", lambda r, d: d not in ignore_list)) 
9

其实,os.walk可以做你想做什么。假设我有一个要在ignore中忽略的目录列表(可能是一组)。然后这应该工作:

def my_walk(top_dir, ignore): 
    for dirpath, dirnames, filenames in os.walk(top_dir): 
     dirnames[:] = [ 
      dn for dn in dirnames 
      if os.path.join(dirpath, dn) not in ignore ] 
     yield dirpath, dirnames, filenames 
+1

我忘了切片分配,我冒昧地将其添加到我的代码。 – 2009-05-29 10:10:50

2

这是最好的和简单的解决方案。

def walk(ignores): 
    global ignore 
    path = os.getcwd() 
    for root, dirs, files in os.walk(path): 
     for ignore in ignores: 
      if(ignore in dirs): 
       dirs.remove(ignore) 
     print root 
     print dirs 
     print files 
walk(['.git', '.svn']) 

请记住,如果您从dirs中删除文件夹名称,它将不会被os.walk探索。

希望它有帮助