936 votes

Utiliser un Glob() pour trouver les fichiers récursivement en Python ?

C’est ce que j’ai :

mais je veux rechercher les sous-dossiers de la src. Quelque chose comme ça pourrait fonctionner :

Mais c’est évidemment limitée et maladroit.

1659voto

Johan Dahlin Points 6296

Utiliser os.walk récursive de pied un répertoire et d' fnmatch.filter de match contre un simple expression:

import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('src'):
  for filename in fnmatch.filter(filenames, '*.c'):
      matches.append(os.path.join(root, filename))

Pour les versions de Python âgés de plus de 2.2, utilisez glob.glob contre chaque nom de fichier au lieu de fnmatch.filter.

120voto

Bruno Oliveira Points 1130

Comme pour les autres solutions, mais à l’aide de fnmatch.fnmatch au lieu de glob, comme os.walk déjà énumérés les noms de fichiers :

En outre, à l’aide d’un générateur permet vous pour traiter chaque fichier tel qu’il se trouve, au lieu de trouver tous les fichiers , puis leur traitement.

91voto

miracle2k Points 3285

J’ai modifié le module glob pour soutenir ** pour la globalisation récursive :

https://github.com/miracle2k/python-Glob2/

Utile lorsque vous souhaitez fournir à vos utilisateurs la possibilité d’utiliser le ** syntaxe et donc os.walk() seul n’est pas assez bon.

41voto

Alex Martelli Points 330805
import os, fnmatch

def recursive_glob(treeroot, pattern):
  results = []
  for base, dirs, files in os.walk(treeroot):
    goodfiles = fnmatch.filter(files, pattern)
    results.extend(os.path.join(base, f) for f in goodfiles)
  return results

fnmatch vous donne exactement les mêmes modèles qu' glob, donc c'est vraiment un excellent remplacement pour les glob.glob avec très proche de la sémantique. Un processus itératif de version (par exemple un générateur), OIE un remplacement pour glob.iglob, est une simple adaptation (juste yield les résultats intermédiaires que vous allez, au lieu de extending une seule liste de résultats pour retourner à la fin).

21voto

Geoff Reedy Points 16508

Vous aurez envie d’utiliser `` pour recueillir les noms de fichiers qui correspondent à vos critères. Par exemple :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X