Maison >développement back-end >Tutoriel Python >Comment puis-je rechercher et répertorier efficacement des fichiers dans des sous-dossiers à l'aide de Python ?
Recherche récursive de sous-dossiers et liste de fichiers
Il est courant de rencontrer des scénarios dans lesquels vous devez parcourir plusieurs sous-dossiers et extraire des fichiers spécifiques en fonction de leur extension de fichier. Une approche pour résoudre ce problème consiste à exploiter la fonction os.walk intégrée de Python, qui permet une exploration récursive des répertoires et de leur contenu.
Cependant, comme rencontré dans cette question, le comportement problématique survient lors de la tentative de concaténation des fichiers. chemins des fichiers. La variable subFolder renvoyée par os.walk représente une liste de sous-dossiers plutôt que le dossier spécifique où réside chaque fichier.
Pour remédier à ce problème, l'approche correcte consiste à utiliser le chemin d'accès (ou la racine dans le code donné) , qui représente le répertoire actuel pour l'itération. La valeur du chemin d'accès doit être concaténée avec le nom du fichier pour construire le chemin complet du fichier.
De plus, il est important de prendre en compte des facteurs supplémentaires tels que l'élagage de certains dossiers du processus de récursion, qui peut être obtenu en examinant le dn (nom du répertoire). Pour éviter de recourir à la manipulation de chaînes pour vérifier les extensions de fichiers, vous pouvez utiliser la fonction os.path.splitext.
Voici une version optimisée du code qui intègre ces améliorations :
<code class="python">import os result = [ os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == ".txt" ]</code>
Comme alternative, glob est un autre outil puissant qui peut être utilisé pour sélectionner des fichiers en fonction de leurs extensions. Voici un exemple utilisant glob :
<code class="python">import os from glob import glob result = [ y for x in os.walk(PATH) for y in glob(os.path.join(x[0], "*.txt")) ]</code>
Pour Python 3.4, Pathlib fournit une approche intuitive pour cette tâche :
<code class="python">from pathlib import Path result = list(Path(".").rglob("*.[tT][xX][tT]"))</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!