Lister les répertoires et fichiers, ... mais pas tous

Le
Laurent Claessens
Bonjour

J'ai besoin de lister les fichiers et sous-répertoires d'un certain
gros répertoire (1000 sous-répertories au moins)

La base de mon script est de faire

for root, dirs, files in os.walk(HOME):

Mon problème est le suivant. Je veux exclure certains répertoires de
la liste (et leurs sous-répertoires)

Bien entendu, je peux encore faire
for root, dirs, files in os.walk(HOME):
et tester si root est dans la liste des répertoires à exclure.

Seulement, cela est un énorme problème de rapidité : même si un
répertoire est exclu, la boucle for va quand même en lire tout le
contenu récursivement.

D'où ma question : est-ce qu'il existe une méthode pour lister les
répertoires et fichiers récursivement en excluant certains répertoire=
s
(et leurs sous-répertoires) ?

Je peux évidement faire la récursion à la main (en utilisant
os.listdir), mais je voudrais savoir si il y a une méthode plus
standard.

Bonne soirée
Laurent
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Kobayashi
Le #19617551
Laurent Claessens a écrit :
Bonjour

J'ai besoin de lister les fichiers et sous-répertoires d'un certain
gros répertoire (1000 sous-répertories au moins)

La base de mon script est de faire

for root, dirs, files in os.walk(HOME):

Mon problème est le suivant. Je veux exclure certains répertoires de
la liste (et leurs sous-répertoires)

Bien entendu, je peux encore faire
for root, dirs, files in os.walk(HOME):
et tester si root est dans la liste des répertoires à exclure.

Seulement, cela est un énorme problème de rapidité : même si un
répertoire est exclu, la boucle for va quand même en lire tout le
contenu récursivement.



Bonjour,

Il me semble que justement os.walk est fait pour ça ...
sauf qu'il faut exclure les répertoires indésirables
de dirs et non pas quand on est déjà dedans en testant
la valeur de root (c'est ce que tu fais si j'ai bien
compris)

Ensuite, si dirs est vraiment grand, il faut sans
doute faire un truc rusé pour éliminer les répertoires
indésirables de dirs ... Pour moi, ce n'est pas le cas
et j'ai juste fait

try:
dirs.remove('CVS')
except ValueError:
pass

qui est l'exemple de la doc d'ailleurs.

Cordialement,

K.


D'où ma question : est-ce qu'il existe une méthode pour lister les
répertoires et fichiers récursivement en excluant certains répertoires
(et leurs sous-répertoires) ?

Je peux évidement faire la récursion à la main (en utilisant
os.listdir), mais je voudrais savoir si il y a une méthode plus
standard.

Bonne soirée
Laurent


Pierre Maurette
Le #19617661
Laurent Claessens, le 22/06/2009 a écrit :
Bonjour

J'ai besoin de lister les fichiers et sous-répertoires d'un certain
gros répertoire (1000 sous-répertories au moins)

La base de mon script est de faire

for root, dirs, files in os.walk(HOME):

Mon problème est le suivant. Je veux exclure certains répertoires de
la liste (et leurs sous-répertoires)

Bien entendu, je peux encore faire
for root, dirs, files in os.walk(HOME):
et tester si root est dans la liste des répertoires à exclure.

Seulement, cela est un énorme problème de rapidité : même si un
répertoire est exclu, la boucle for va quand même en lire tout le
contenu récursivement.



Justement, sans avoir testé, je n'en suis pas certain. Dans le manuel
de os.walk(top[, topdown=True[, onerror=None[, followlinksúlse]]]):

"When topdown is True, the caller can modify the dirnames list in-place
(perhaps using del or slice assignment), and walk() will only recurse
into the subdirectories whose names remain in dirnames; this can be
used to prune the search, [etc.]"

Pas le temps d'essayer, mais je le ferai...

--
Pierre Maurette
Laurent Claessens
Le #19620351
> Justement, sans avoir testᅵ, je n'en suis pas certain. Dans le ma nuel
de os.walk(top[, topdown=True[, onerror=None[, followlinksúlse]]] ):

"When topdown is True, the caller can modify the dirnames list in-place
(perhaps using del or slice assignment), and walk() will only recurse
into the subdirectories whose names remain in dirnames; this can be
used to prune the search, [etc.]"



Youpie, c'est ce que je cherchais.

Au fait, quand vous parlez de "la doc", moi j'ai le document
Python Library Reference de Guido van Rossum (qui contient le bou
cité). C'est bon, ou vous me conseillez un autre ?

Merci et bonne journée
Laurent
Kobayashi
Le #19620661
Laurent Claessens a écrit :
Justement, sans avoir testᅵ, je n'en suis pas certain. Dans le manuel
de os.walk(top[, topdown=True[, onerror=None[, followlinksúlse]]]):

"When topdown is True, the caller can modify the dirnames list in-place
(perhaps using del or slice assignment), and walk() will only recurse
into the subdirectories whose names remain in dirnames; this can be
used to prune the search, [etc.]"



Youpie, c'est ce que je cherchais.

Au fait, quand vous parlez de "la doc", moi j'ai le document
Python Library Reference de Guido van Rossum (qui contient le bou
cité). C'est bon, ou vous me conseillez un autre ?



Perso., je consulte la doc. en ligne.
Pour le module os, c'est
http://docs.python.org/library/os.html
mais c'est en anglais.

K.


Merci et bonne journée
Laurent


Publicité
Poster une réponse
Anonyme