2009-05-29 16 views

Respuesta

1

Hice, pues, esta casa de papeles función 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

Es posible modificar el segundo elemento de valores de retorno os.walk 's in situ:

[...] la persona que llama puede modificar la lista de dirnames in situ (tal vez usando la asignación del o slice), y walk() solo recurrirá en los subdirectorios cuyos nombres permanecen en dirnames; esto puede ser usado para podar la búsqueda [...]

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 

Ahora, usted puede simplemente la mano en un predicado para los subdirectorios:

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

En realidad, os.walk puede hacer exactamente lo que quiere . Supongamos que tengo una lista (tal vez un conjunto) de directorios para ignorar en ignore. Entonces esto debería funcionar:

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

De alguna manera me olvidé de la asignación de sectores, me tomé la libertad de agregar eso a mi código. –

+2

Esta es la manera esperada de hacerlo, incluso lo dice en la documentación de os.path.walk(). – unwind

+1

No, me refiero a la asignación de división completa como una forma de modificar toda la lista, no el hecho de que puede cambiarla. –

2

Aquí está la mejor y más simple solución.

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

Recuerde, si elimina el nombre de la carpeta de los directorios, no será explorado por os.walk.

Espero que ayude

Cuestiones relacionadas