2009-05-29 9 views

risposta

1

Così ho fatto questa casa-ruoli funzione walker:

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

E 'possibile modificare il secondo elemento di valori di ritorno os.walk s' in-place:

[...] il chiamante può modificare l'elenco dei nomi sul posto (magari usando l'assegnazione del o slice), e walk() ricercherà solo nelle sottodirectory i cui nomi rimangono in dirnames; questo può essere usato per potare alla ricerca [...]

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 

Ora, si può semplicemente mano in un predicato per la sottodirectory:

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

In realtà, os.walk può fare esattamente quello che vuoi . Dire che ho una lista (forse un set) di directory da ignorare in ignore. Quindi questo dovrebbe funzionare:

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

io in qualche modo dimenticato di assegnazione fetta, mi sono permesso di aggiungere che al mio codice. –

+2

Questo è il modo previsto per farlo, lo dice anche nella documentazione di os.path.walk(). – unwind

+1

No, intendo l'assegnazione della slice completa come metodo per modificare l'intero elenco, non il fatto che è possibile modificarlo. –

2

Ecco la soluzione migliore e semplice.

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

Ricordare, se si rimuove il nome della cartella da dirs, non verrà esplorato da os.walk.

Speranza che aiuta

Problemi correlati