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

4 réponses
Avatar
Laurent Claessens
Bonjour

J'ai besoin de lister les fichiers et sous-r=E9pertoires d'un certain
gros r=E9pertoire (1000 sous-r=E9pertories au moins)

La base de mon script est de faire

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

Mon probl=E8me est le suivant. Je veux exclure certains r=E9pertoires de
la liste (et leurs sous-r=E9pertoires)

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

Seulement, cela est un =E9norme probl=E8me de rapidit=E9 : m=EAme si un
r=E9pertoire est exclu, la boucle for va quand m=EAme en lire tout le
contenu r=E9cursivement.

D'o=F9 ma question : est-ce qu'il existe une m=E9thode pour lister les
r=E9pertoires et fichiers r=E9cursivement en excluant certains r=E9pertoire=
s
(et leurs sous-r=E9pertoires) ?

Je peux =E9videment faire la r=E9cursion =E0 la main (en utilisant
os.listdir), mais je voudrais savoir si il y a une m=E9thode plus
standard.

Bonne soir=E9e
Laurent

4 réponses

Avatar
Kobayashi
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


Avatar
Pierre Maurette
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
Avatar
Laurent Claessens
> 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
Avatar
Kobayashi
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