2009-05-29 5 views

Répondre

1

donc j'ai fait cette maison-rôles fonction 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

Il est possible de modifier le deuxième élément des valeurs de retour de os.walk en place:

[...] l'appelant peut modifier la liste des noms de répertoire sur place (en utilisant peut-être une affectation del ou slice), et walk() ne se recurdera que dans les sous-répertoires dont les noms restent dans les noms de répertoire; cela peut être utilisé pour élaguer la recherche [...]

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 

Maintenant, vous pouvez simplement la main dans un prédicat pour les sous-répertoires:

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

En fait, os.walk peut faire exactement ce que vous voulez . Dites que j'ai une liste (peut-être un ensemble) de répertoires à ignorer dans ignore. Alors cela devrait fonctionner:

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

J'ai quelque peu oublié l'attribution de tranches, j'ai pris la liberté d'ajouter cela à mon code. –

+2

C'est la manière attendue de le faire, même dans la documentation de os.path.walk(). – unwind

+1

Non, je veux dire l'assignation de tranches entières comme un moyen de modifier la liste entière, pas le fait que vous pouvez le changer. –

2

Voici la solution la meilleure et la plus simple. N'oubliez pas que si vous supprimez le nom de dossier des répertoires, il ne sera pas exploré par os.walk. J'ai espéré que ça aide

Questions connexes