Voici une variante de compréhension de liste en une ligne de la réponse de Pat (qui comprend également que vous vouliez glober dans un répertoire de projet spécifique):
import os, glob
exts = ['*.txt', '*.mdown', '*.markdown']
files = [f for ext in exts for f in glob.glob(os.path.join(project_dir, ext))]
Vous bouclez sur les extensions ( for ext in exts
), puis pour chaque extension, vous prenez chaque fichier correspondant au modèle global ( for f in glob.glob(os.path.join(project_dir, ext)
).
Cette solution est courte et sans boucles for inutiles, compréhensions de listes imbriquées ou fonctions pour encombrer le code. Un Zen pur, expressif et pythonique .
Cette solution vous permet d'avoir une liste personnalisée de ceux exts
qui peuvent être modifiés sans avoir à mettre à jour votre code. (C'est toujours une bonne pratique!)
La liste-compréhension est la même que celle utilisée dans la solution de Laurent (pour laquelle j'ai voté). Mais je dirais qu'il est généralement inutile de factoriser une seule ligne vers une fonction distincte, c'est pourquoi je propose cela comme une solution alternative.
Prime:
Si vous avez besoin de rechercher non seulement un seul répertoire, mais également tous les sous-répertoires, vous pouvez passer recursive=True
et utiliser le symbole glob multi-répertoires **
1 :
files = [f for ext in exts
for f in glob.glob(os.path.join(project_dir, '**', ext), recursive=True)]
Cela invoquera glob.glob('<project_dir>/**/*.txt', recursive=True)
et ainsi de suite pour chaque extension.
1 Techniquement, le **
symbole glob correspond simplement à un ou plusieurs caractères, y compris la barre oblique /
(contrairement au *
symbole glob singulier ). En pratique, vous devez simplement vous rappeler que tant que vous entourez **
de barres obliques (séparateurs de chemin), cela correspond à zéro ou plusieurs répertoires.