215 votes

Comment faire une recherche récursive dans un sous-dossier et retourner les fichiers dans une liste ?

Je travaille sur un script pour parcourir récursivement les sous-dossiers d'un dossier principal et construire une liste à partir d'un certain type de fichier. J'ai un problème avec le script. Il est actuellement configuré comme suit :

for root, subFolder, files in os.walk(PATH):
    for item in files:
        if item.endswith(".txt") :
            fileNamePath = str(os.path.join(root,subFolder,item))

le problème est que le subFolder extrait une liste de sous-dossiers plutôt que le dossier dans lequel se trouve le fichier ITEM. Je pensais exécuter une boucle for pour le sous-dossier avant et rejoindre la première partie du chemin d'accès, mais je me suis dit que je devais vérifier si quelqu'un avait des suggestions avant cela.

4voto

Minh Nguyen Points 190

Si cela ne vous dérange pas d'installer une bibliothèque de lumière supplémentaire, vous pouvez le faire :

pip install plazy

Utilisation :

import plazy

txt_filter = lambda x : True if x.endswith('.txt') else False
files = plazy.list_files(root='data', filter_func=txt_filter, is_include_root=True)

Le résultat devrait ressembler à ceci :

['data/a.txt', 'data/b.txt', 'data/sub_dir/c.txt']

Il fonctionne à la fois sur Python 2.7 et Python 3.

Github : https://github.com/kyzas/plazy#list-files

Disclaimer : Je suis un auteur de plazy .

2voto

user3376851 Points 119

Vous pouvez utiliser le paramètre "récursif" du module glob pour rechercher dans les sous-répertoires.

Par exemple :

import glob
glob.glob('//Mypath/folder/**/*',recursive = True)

La deuxième ligne renvoie tous les fichiers contenus dans les sous-répertoires de cet emplacement de dossier (remarque : vous avez besoin de la chaîne '**/*' à la fin de votre chaîne de dossier pour faire cela).

Si vous souhaitez spécifiquement trouver des fichiers texte au plus profond de vos sous-répertoires, vous pouvez utiliser la méthode suivante

glob.glob('//Mypath/folder/**/*.txt',recursive = True)

0voto

Devymex Points 364

La méthode la plus simple et la plus basique :

import os
for parent_path, _, filenames in os.walk('.'):
    for f in filenames:
        print(os.path.join(parent_path, f))

0voto

Siltal Points 1
list_all_file = lambda path: list(map(lambda i:fun(f'{path}/{i}') ,os.listdir(path))) if os.path.isdir(path) and os.listdir(path) else print(path)

puis vous fournissez un nom de répertoire, il imprimera tous les fichiers et le répertoire vide qui est le noeud feuille.

list_all_file(sub_folder)

Bien joué !

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