2009-05-29 135 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探索。

希望它有幫助