2009-05-29 27 views

Trả lời

1

Vì vậy, tôi thực hiện điều này tại nhà vai trò walker chức năng:

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

Có thể sửa đổi phần tử thứ hai của giá trị trả lại os.walk 's tại chỗ:

[...] người gọi có thể sửa đổi danh sách dirnames tại chỗ (có thể bằng cách sử dụng del hoặc phân bổ lát), và walk() sẽ chỉ recurse vào các thư mục con có tên vẫn còn trong dirnames; điều này có thể được sử dụng để prune tìm kiếm [...]

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 

Bây giờ, bạn có thể chỉ tay vào một vị cho các thư mục con:

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

Trên thực tế, os.walk có thể thực hiện chính xác những gì bạn muốn . Giả sử tôi có một danh sách (có thể là một tập hợp) các thư mục để bỏ qua trong ignore. Sau đó, điều này sẽ hoạt động:

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

Tôi bằng cách nào đó quên về phân bổ lát, tôi đã tự do thêm mã đó vào mã của tôi. –

+2

Đây là cách dự kiến ​​để làm như vậy, thậm chí nói như vậy trong tài liệu hướng dẫn của os.path.walk(). – unwind

+1

Không, ý tôi là phân bổ toàn bộ trang như là một cách sửa đổi toàn bộ danh sách, chứ không phải thực tế là bạn có thể thay đổi nó. –

2

Đây là giải pháp tốt nhất và đơn giản nhất.

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']) 

Hãy nhớ rằng, nếu bạn xóa tên thư mục khỏi thư mục, nó sẽ không được khám phá bởi os.walk.

hy vọng nó sẽ giúp

Các vấn đề liên quan