Existe-t-il un meilleur moyen d'utiliser glob.glob en python pour obtenir une liste de plusieurs types de fichiers tels que .txt, .mdown et .markdown? En ce moment, j'ai quelque chose comme ça:
projectFiles1 = glob.glob( os.path.join(projectDir, '*.txt') )
projectFiles2 = glob.glob( os.path.join(projectDir, '*.mdown') )
projectFiles3 = glob.glob( os.path.join(projectDir, '*.markdown') )
Réponses:
Il existe peut-être un meilleur moyen, mais qu'en est-il:
Il y a peut-être un autre moyen, alors attendez au cas où quelqu'un d'autre trouverait une meilleure réponse.
la source
files_grabbed = [glob.glob(e) for e in ['*.pdf', '*.cpp']]
[f for f_ in [glob.glob(e) for e in ('*.jpg', '*.mp4')] for f in f_]
Si vous avez besoin de spécifier un chemin, faites une boucle sur les modèles de correspondance et conservez la jointure à l'intérieur de la boucle pour plus de simplicité:
la source
glob
renvoie une liste: pourquoi ne pas l'exécuter plusieurs fois et concaténer les résultats?la source
ProjectFiles
laprojectFiles
, mais une grande solution.Chaîne les résultats:
Ensuite:
la source
chain.from_iterable
. Donc , ce qui est similaire, mais moins lisible:it.chain(*(glob.iglob(pattern) for pattern in patterns))
.Autant de réponses qui suggèrent de glober autant de fois que de nombre d'extensions, je préférerais glober une seule fois à la place:
la source
avec glob ce n'est pas possible. vous ne pouvez utiliser que:
* correspond à tout
? correspond à n'importe quel caractère unique
[seq] correspond à n'importe quel caractère de seq
[! seq] correspond à tout caractère ne figurant pas dans seq
utilisez os.listdir et une expression régulière pour vérifier les modèles:
la source
itertools
parce que les changements de modèle ultérieurs doivent également être piratés (disons que vous voulez autoriser les majuscules et les minuscules) . Oh, et il pourrait être plus propre d'écrire'.*\.(txt|sql)'
Par exemple, pour
*.mp3
et*.flac
sur plusieurs dossiers, vous pouvez faire:L'idée peut être étendue à plus d'extensions de fichiers, mais vous devez vérifier que les combinaisons ne correspondent à aucune autre extension de fichier indésirable que vous pourriez avoir sur ces dossiers. Alors, soyez prudent avec cela.
Pour combiner automatiquement une liste arbitraire d'extensions en un seul modèle global, vous pouvez effectuer les opérations suivantes:
la source
Un one-liner, juste pour le plaisir.
production:
la source
Après être venu ici pour obtenir de l'aide, j'ai créé ma propre solution et je voulais la partager. Il est basé sur la réponse de user2363986, mais je pense que c'est plus évolutif. Cela signifie que si vous avez 1000 extensions, le code sera toujours un peu élégant.
la source
directoryPath = "/Users/bla/bla/images_dir*."
la source
Bien que le glob par défaut de Python ne suive pas vraiment le glob de Bash, vous pouvez le faire avec d'autres bibliothèques. Nous pouvons activer les accolades dans le glob de wcmatch .
Vous pouvez même utiliser des modèles globaux étendus si tel est votre préférence:
la source
recursive
drapeauglob.GLOBSTAR
drapeauJ'ai publié Formic qui implémente plusieurs inclusions d' une manière similaire à FileSet et Globs d'Apache Ant .
La recherche peut être mise en œuvre:
Étant donné que le glob Ant complet est implémenté, vous pouvez inclure différents répertoires avec chaque modèle, vous pouvez donc choisir uniquement ces fichiers .txt dans un sous-répertoire et le .markdown dans un autre, par exemple:
J'espère que ça aide.
la source
La fonction suivante
_glob
regroupe plusieurs extensions de fichier.la source
Ceci est une
pathlib
solution Python 3.4+ :De plus, il ignore tous les noms de fichiers commençant par
~
.la source
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):
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 :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.la source
Non
glob
, mais voici une autre façon d'utiliser une compréhension de liste:la source
Vous pouvez essayer de faire une liste manuelle comparant l'extension de l'existant avec ceux dont vous avez besoin.
la source
https://docs.python.org/3.5/library/functools.html#functools.reduce https://docs.python.org/3.5/library/operator.html#operator.add
la source
Pour
glob
plusieurs types de fichiers, vous devez appeler laglob()
fonction plusieurs fois dans une boucle. Puisque cette fonction renvoie une liste, vous devez concaténer les listes.Par exemple, cette fonction fait le travail:
Utilisation simple:
Vous pouvez également utiliser
glob.iglob()
pour avoir un itérateur:la source
Utilisez une liste d'extensions et parcourez
la source
Vous pouvez utiliser le filtre:
la source
Vous pouvez également utiliser
reduce()
comme ceci:cela crée une liste à partir de
glob.glob()
pour chaque modèle et les réduit à une seule liste.la source
Un glob, de nombreuses extensions ... mais une solution imparfaite (peut correspondre à d'autres fichiers).
la source
J'ai eu le même problème et c'est ce que j'ai trouvé
la source
Encore une autre solution (utiliser
glob
pour obtenir des chemins en utilisant plusieurs correspondancespatterns
et combiner tous les chemins en une seule liste en utilisantreduce
etadd
):la source
Si vous utilisez,
pathlib
essayez ceci:la source
D'après les résultats que j'ai obtenus à partir de tests empiriques, il s'est avéré que ce
glob.glob
n'était pas la meilleure façon de filtrer les fichiers par leurs extensions. Certaines des raisons sont:J'ai testé (pour l'exactitude et l'efficacité dans le temps) les
4
différentes méthodes suivantes pour filtrer les fichiers par extensions et les mettre dans unlist
:En exécutant le code ci-dessus sur mon ordinateur portable, j'ai obtenu les résultats auto-explicatifs suivants.
Le moyen le plus rapide de filtrer les fichiers par extensions est même le plus laid. Autrement dit,
for
boucles imbriquées etstring
comparaison à l'aide de laendswith()
méthode.De plus, comme vous pouvez le voir, les algorithmes de globbing (avec le modèle
E:\x\y\z\**/*[py][pyc]
) même avec seulement l'2
extension donnée (py
etpyc
) retournent également des résultats incorrects.la source
la source
Cela devrait fonctionner:
la source
Par exemple:
Une fonction:
la source