Je me rends compte que cela n'a pas été demandé dans la question, mais j'ai eu un problème similaire où je voulais exclure à la fois les fichiers cachés et les fichiers commençant par __
, plus précisément __pycache__
répertoires. J'ai atterri sur cette question parce que j'essayais de comprendre pourquoi ma compréhension de liste ne faisait pas ce que j'attendais. Je ne modifiais pas la liste en place avec dirnames[:]
.
J'ai créé une liste de préfixes que je voulais exclure et j'ai modifié les noms de répertoire en place comme ceci :
exclude_prefixes = ('__', '.') # exclusion prefixes
for dirpath, dirnames, filenames in os.walk(node):
# exclude all dirs starting with exclude_prefixes
dirnames[:] = [dirname
for dirname in dirnames
if not dirname.startswith(exclude_prefixes)]
Mon cas d'utilisation était similaire à celui d'OP, sauf que je voulais renvoyer le nombre total de sous-répertoires dans un certain dossier. Dans mon cas, je voulais omettre tous les sous-répertoires nommés .git
(ainsi que tous les dossiers qui peuvent être imbriqués dans ces .git
dossiers).
Dans Python 3.6.7, j'ai trouvé que l'approche de la réponse acceptée ne fonctionnait pas - elle comptait tous les .git
dossier et leurs sous-dossiers. Voici ce qui a fonctionné pour moi :
num_local_subdir = 0
for root, dirs, files in os.walk(local_folder_path):
if '.git' in dirs:
dirs.remove('.git')
num_local_subdir += (len(dirs))
Non, il n'y a pas d'option pour os.walk()
cela sautera ceux-là. Vous devrez le faire vous-même (ce qui est assez simple) :
for root, dirs, files in os.walk(path):
files = [f for f in files if not f[0] == '.']
dirs[:] = [d for d in dirs if not d[0] == '.']
# use files and dirs
Notez le dirs[:] =
affectation de tranche ; os.walk
parcourt récursivement les sous-répertoires listés dans dirs
. En remplaçant les éléments de dirs
avec ceux qui répondent à un critère (par exemple, les répertoires dont les noms ne commencent pas par .
), os.walk()
ne visitera pas les répertoires qui ne répondent pas aux critères.
Cela ne fonctionne que si vous conservez le topdown
argument de mot-clé à True
, à partir de la documentation de os.walk()
:
Quand
topdown
estTrue
, l'appelant peut modifier la liste des noms de répertoire sur place (peut-être en utilisantdel
ou affectation de tranche) etwalk()
ne récursera que dans les sous-répertoires dont les noms restent dans dirnames; cela peut être utilisé pour élaguer la recherche, imposer un ordre de visite précis, ou encore pour renseignerwalk()
sur les répertoires que l'appelant crée ou renomme avant de reprendrewalk()
à nouveau.