Python 3.5+
Puisque vous êtes sur un nouveau python, vous devez utiliser à pathlib.Path.rglob
partir du pathlib
module.
from pathlib import Path
for path in Path('src').rglob('*.c'):
print(path.name)
Si vous ne voulez pas utiliser pathlib, utilisez simplement glob.glob
, mais n'oubliez pas de passer le recursive
paramètre de mot - clé.
Pour les cas où les fichiers correspondants commençant par un point (.); comme les fichiers du répertoire courant ou les fichiers cachés sur un système basé sur Unix, utilisez la os.walk
solution ci-dessous.
Versions Python plus anciennes
Pour les anciennes versions de Python, utilisez os.walk
pour parcourir récursivement un répertoire et fnmatch.filter
pour faire correspondre une expression simple:
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))
os.path.walk()
qui est un peu plus délicat à utiliser queos.walk()
os.path.walk()
est obsolète et a été supprimé en Python 3.pathlib.Path('src').glob('**/*.c')
devrait fonctionner.Similaire à d'autres solutions, mais en utilisant fnmatch.fnmatch au lieu de glob, car os.walk a déjà répertorié les noms de fichiers:
De plus, l'utilisation d'un générateur vous permet de traiter chaque fichier tel qu'il est trouvé, au lieu de rechercher tous les fichiers , puis de les traiter.
la source
reduce(lambda x, y: x+y, map(lambda (r,_,x):map(lambda f: r+'/'+f, filter(lambda f: fnmatch.fnmatch(f, pattern), x)), os.walk('src/webapp/test_scripts')))
(os.path.join(root,filename) for root, dirs, files in os.walk(directory) for filename in files if fnmatch.fnmatch(filename, pattern))
J'ai modifié le module glob pour prendre en charge ** la globalisation récursive, par exemple:
https://github.com/miracle2k/python-glob2/
Utile lorsque vous souhaitez donner à vos utilisateurs la possibilité d'utiliser la syntaxe **, et donc os.walk () seul n'est pas suffisant.
la source
**
avec le module officiel de glob, faites:glob(path, recursive=True)
À partir de Python 3.4, on peut utiliser la
glob()
méthode de l'une desPath
classes du nouveau module pathlib , qui prend en charge les**
caractères génériques. Par exemple:Mise à jour: à partir de Python 3.5, la même syntaxe est également prise en charge par
glob.glob()
.la source
fnmatch
vous donne exactement les mêmes modèles queglob
, donc c'est vraiment un excellent remplacement pourglob.glob
une sémantique très proche. Une version itérative (par exemple un générateur), IOW en remplacementglob.iglob
, est une adaptation triviale (justeyield
les résultats intermédiaires au fur et à mesure, au lieu deextend
générer une seule liste de résultats à retourner à la fin).la source
recursive_glob(pattern, treeroot='.')
comme je l'ai suggéré dans mon montage? De cette façon, il peut être appelé par exemple commerecursive_glob('*.txt')
et correspondre intuitivement à la syntaxe deglob
.fnmatch.filter
, ce qui est à peu près aussi utile que la possibilité de faire correspondre un seul argumentglob.glob
.Pour python> = 3.5 , vous pouvez utiliser
**
,recursive=True
:Démo
la source
Vous voudrez utiliser
os.walk
pour collecter des noms de fichiers qui correspondent à vos critères. Par exemple:la source
Voici une solution avec des listes de listes imbriquées
os.walk
et une correspondance de suffixe simple au lieu deglob
:Il peut être compressé en une seule ligne:
ou généralisé en fonction:
Si vous avez besoin de
glob
modèles de style complet , vous pouvez suivre l'exemple d'Alex et de Bruno et utiliserfnmatch
:la source
Récemment, j'ai dû récupérer mes photos avec l'extension .jpg. J'ai couru photorec et récupéré 4579 répertoires dans 2,2 millions de fichiers, avec une grande variété d'extensions. Avec le script ci-dessous, j'ai pu sélectionner 50133 fichiers havin .jpg extension en quelques minutes:
la source
Considérez
pathlib.rglob()
.Voir aussi le post connexe de @ taleinat ici et un post similaire ailleurs.
la source
Johan et Bruno fournissent d'excellentes solutions sur l'exigence minimale comme indiqué. Je viens de publier Formic qui implémente Ant FileSet et Globs qui peuvent gérer cela et des scénarios plus compliqués. Une implémentation de votre exigence est:
la source
sur la base d'autres réponses, voici mon implémentation de travail actuelle, qui récupère les fichiers xml imbriqués dans un répertoire racine:
Je m'amuse vraiment avec python :)
la source
Une autre façon de le faire en utilisant uniquement le module glob. Il suffit d'amorcer la méthode rglob avec un répertoire de base de départ et un modèle pour correspondre et il renverra une liste de noms de fichiers correspondants.
la source
Pour python 3.5 et versions ultérieures
plus vous pourriez avoir besoin
la source
/**
cela fonctionne pour moi, comme ça:file_names_array = glob.glob('src/**/*.c', recursive=True)
Ou avec une compréhension de la liste:
la source
Je viens de faire cela .. il imprimera les fichiers et le répertoire de manière hiérarchique
Mais je n'ai pas utilisé fnmatch ou walk
la source
Celui-là utilise fnmatch ou expression régulière:
la source
En plus des réponses suggérées, vous pouvez le faire avec une génération de paresseux et une magie de compréhension de liste:
En plus de tenir sur une seule ligne et d'éviter les listes inutiles en mémoire, cela a aussi le bel effet secondaire, que vous pouvez l'utiliser d'une manière similaire à l'opérateur **, par exemple, vous pouvez utiliser
os.path.join(root, 'some/path/*.c')
pour obtenir tous les fichiers .c en tout sous-répertoires de src qui ont cette structure.la source
Il s'agit d'un code de travail sur Python 2.7. Dans le cadre de mon travail de devops, je devais écrire un script qui déplacerait les fichiers de configuration marqués avec live-appName.properties vers appName.properties. Il pourrait y avoir d'autres fichiers d'extension comme live-appName.xml.
Voici un code de travail pour cela, qui trouve les fichiers dans les répertoires donnés (niveau imbriqué) puis le renomme (déplace) au nom de fichier requis
Cette fonction est appelée à partir d'un script principal
J'espère que cela aidera quelqu'un aux prises avec des problèmes similaires.
la source
Version simplifiée de la réponse de Johan Dahlin, sans fnmatch .
la source
Voici ma solution en utilisant la compréhension de liste pour rechercher plusieurs extensions de fichiers récursivement dans un répertoire et tous les sous-répertoires:
la source
la source
J'ai modifié la première réponse dans cette publication .. et récemment créé ce script qui parcourra tous les fichiers dans un répertoire donné (searchdir) et les sous-répertoires en dessous ... et imprime le nom de fichier, rootdir, la date de modification / création et Taille.
J'espère que cela aide quelqu'un ... et qu'il pourra parcourir le répertoire et obtenir fileinfo.
la source
Voici une solution qui fera correspondre le modèle au chemin complet et pas seulement au nom de fichier de base.
Il utilise
fnmatch.translate
pour convertir un modèle de style glob en une expression régulière, qui est ensuite comparée au chemin complet de chaque fichier trouvé lors de la marche dans le répertoire.re.IGNORECASE
est facultatif, mais souhaitable sous Windows car le système de fichiers lui-même n'est pas sensible à la casse. (Je n'ai pas pris la peine de compiler l'expression régulière, car les documents indiquent qu'elle doit être mise en cache en interne.)la source
J'avais besoin d'une solution pour python 2.x qui fonctionne rapidement sur les grands répertoires.
Je me retrouve avec ceci:
Notez que vous pourriez avoir besoin d'une gestion des exceptions au cas où
ls
il ne trouverait aucun fichier correspondant.la source
ls src/**/*.c
ne fonctionne que si l'option globstar est activée (shopt -s globstar
) - voir cette réponse pour plus de détails.