J'écris un script qui descend dans une arborescence de répertoires (en utilisant os.walk ()), puis visite chaque fichier correspondant à une certaine extension de fichier. Cependant, comme certaines des arborescences de répertoires sur lesquelles mon outil sera utilisé contiennent également des sous-répertoires qui à leur tour contiennent BEAUCOUP de choses inutiles (aux fins de ce script), j'ai pensé que j'ajouterais une option pour que l'utilisateur spécifie une liste de répertoires à exclure de la traversée.
C'est assez simple avec os.walk (). Après tout, c'est à moi de décider si je veux réellement visiter les fichiers / répertoires respectifs générés par os.walk () ou simplement les ignorer. Le problème est que si j'ai, par exemple, une arborescence de répertoires comme celle-ci:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
et je veux exclure uselessStuff et tous ses enfants, os.walk () descendra toujours dans tous les sous-répertoires (potentiellement des milliers de) de uselessStuff , ce qui, inutile de le dire, ralentit beaucoup les choses. Dans un monde idéal, je pourrais dire à os.walk () de ne même pas se donner la peine de donner plus d'enfants de inutileStuff , mais à ma connaissance, il n'y a aucun moyen de le faire (n'est-ce pas?).
est-ce que quelqu'un a une idée? Peut-être existe-t-il une bibliothèque tierce qui fournit quelque chose comme ça?
dirs[:] =
?dirs[:] = value
modifiedirs
sur place . Il modifie le contenu de la listedirs
sans changer le conteneur. Commehelp(os.walk)
mentionné, cela est nécessaire si vous souhaitez affecter la façon dontos.walk
traverse les sous-répertoires. (dirs = value
réaffecte simplement (ou "lie") la variabledirs
à une nouvelle liste, sans modifier l'originaldirs
.)filter()
:dirs[:] = list(filter(lambda x: not x in exclude, dirs))
os.walk
et produitroot, dirs, files
après avoir exclu.git
(ou tout ce que vous souhaitez)dirs
.... une forme alternative de l'excellente réponse de @ unutbu qui se lit un peu plus directement, étant donné que l'intention est d' exclure les répertoires, au prix du temps O (n ** 2) vs O (n).
(Faire une copie de la liste des répertoires avec
list(dirs)
est nécessaire pour une exécution correcte)la source
dirs[:] = set(dirs) - exclude
. Au moins, c'est toujours \ $ O (n) \ $ et vous ne construisez pas une compréhension uniquement pour ses effets secondaires ...for d in list(dirs)
c'est un peu bizarre.dirs
est déjà une liste. Et ce que vous avez n'est pas vraiment une compréhension de liste.dirs.remove(d)
ne renvoie rien, donc vous vous retrouvez avec une liste pleine deNone
s. Je suis d'accord avec @Torsten.