Je veux ouvrir une série de sous-dossiers dans un dossier et trouver des fichiers texte et imprimer quelques lignes des fichiers texte. J'utilise ceci:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Mais cela ne peut pas non plus accéder aux sous-dossiers. Quelqu'un sait-il comment je peux utiliser la même commande pour accéder aux sous-dossiers également?
python
filesystems
glob
fnmatch
UserYmY
la source
la source
Réponses:
Dans Python 3.5 et plus récent, utilisez la nouvelle
**/
fonctionnalité récursive :Lorsque
recursive
est défini,**
suivi d'un séparateur de chemin correspond à 0 ou plusieurs sous-répertoires.Dans les versions antérieures de Python,
glob.glob()
impossible de répertorier les fichiers dans les sous-répertoires de manière récursive.Dans ce cas, j'utiliserais
os.walk()
combiné avec à lafnmatch.filter()
place:Cela parcourra vos répertoires de manière récursive et retournera tous les chemins absolus vers les
.txt
fichiers correspondants . Dans ce cas précis, celafnmatch.filter()
peut être excessif, vous pouvez également utiliser un.endswith()
test:la source
path to directory
.recursive=False
avec la**/
fonctionnalité ne fournit-il pas la liste des fichiers uniquement dans le dossier donné, mais plutôt dans ses enfants?**/
donne une liste de noms de répertoires dans le répertoire de travail courant, car le modèle se termine par/
, et avecrecursive=False
vous avez fondamentalement un double*
, correspondant exactement à la même chose*/
, juste moins efficace.*/*
si vous avez besoin de tous les fichiers de tous les sous-répertoires.Pour rechercher des fichiers dans des sous-répertoires immédiats:
Pour une version récursive qui traverse tous les sous-répertoires, vous pouvez utiliser
**
et passerrecursive=True
depuis Python 3.5 :Les deux fonctions appellent des listes de retour. Vous pouvez utiliser
glob.iglob()
pour renvoyer les chemins un par un. Ou utilisezpathlib
:Les deux méthodes renvoient des itérateurs (vous pouvez obtenir les chemins un par un).
la source
glob()
à prendre en charge les modèles dans les répertoires.**
cas de récursivité. Mais pour**
fonctionner, vous devez régler lerecursion=True
commutateur, btw.Il y a beaucoup de confusion sur ce sujet. Voyons si je peux le clarifier (Python 3.7):
glob.glob('*.txt') :
correspond à tous les fichiers se terminant par '.txt' dans le répertoire courantglob.glob('*/*.txt') :
idem 1glob.glob('**/*.txt') :
correspond à tous les fichiers se terminant par '.txt' dans les sous-répertoires immédiats uniquement , mais pas dans le répertoire courantglob.glob('*.txt',recursive=True) :
idem 1glob.glob('*/*.txt',recursive=True) :
idem 3glob.glob('**/*.txt',recursive=True):
correspond à tous les fichiers se terminant par '.txt' dans le répertoire courant et dans tous les sous-répertoiresIl est donc préférable de toujours spécifier
recursive=True.
la source
Le package glob2 prend en charge les caractères génériques et est raisonnablement rapide
Sur mon ordinateur portable, il faut environ 2 secondes pour correspondre à plus de 60 000 chemins de fichiers .
la source
Vous pouvez utiliser Formic avec Python 2.6
Divulgation - Je suis l'auteur de ce package.
la source
Voici une version adaptée qui permet des
glob.glob
fonctionnalités similaires sans utiliserglob2
.Donc, si vous avez la structure de répertoire suivante
Tu peux faire quelque chose comme ça
Le
fnmatch
modèle correspond à peu près au nom de fichier entier lui-même, plutôt qu'au nom de fichier uniquement.la source
configfiles = glob.glob('C:/Users/sam/Desktop/**/*.txt")
Ne fonctionne pas pour tous les cas, utilisez plutôt glob2
la source
Si vous pouvez installer le package glob2 ...
Tous les noms de fichiers et dossiers:
la source
Si vous exécutez Python 3.4+, vous pouvez utiliser le
pathlib
module. LaPath.glob()
méthode prend en charge le**
modèle, qui signifie «ce répertoire et tous les sous-répertoires, de manière récursive». Il renvoie un générateur produisant desPath
objets pour tous les fichiers correspondants.la source
Comme l'a souligné Martijn, glob ne peut le faire que via l'
**
opérateur introduit dans Python 3.5. Puisque l'OP a explicitement demandé le module glob, ce qui suit renverra un itérateur d'évaluation paresseux qui se comporte de la même manièreNotez que vous ne pouvez effectuer une itération qu'une seule fois
configfiles
dans cette approche. Si vous avez besoin d'une véritable liste de fichiers de configuration pouvant être utilisés dans plusieurs opérations, vous devrez la créer explicitement en utilisantlist(configfiles)
.la source
La commande
rglob
effectuera une récursion infinie dans le sous-niveau le plus profond de votre structure de répertoires. Si vous ne voulez qu'un seul niveau de profondeur, ne l'utilisez cependant pas.Je me rends compte que l'OP parlait d'utiliser glob.glob. Je crois que cela répond à l'intention, cependant, qui est de rechercher tous les sous-dossiers de manière récursive.
La
rglob
fonction a récemment produit une augmentation de 100 fois de la vitesse pour un algorithme de traitement de données qui utilisait la structure des dossiers comme hypothèse fixe pour l'ordre de lecture des données. Cependant,rglob
nous avons pu effectuer une seule analyse de tous les fichiers dans ou en dessous d'un répertoire parent spécifié, enregistrer leurs noms dans une liste (plus d'un million de fichiers), puis utiliser cette liste pour déterminer quels fichiers nous devions ouvrir à tout moment. point dans le futur en fonction des conventions de dénomination des fichiers uniquement par rapport au dossier dans lequel ils se trouvaient.la source