Maison > Article > développement back-end > Comment parcourir de manière récursive une structure de dossiers pour lire le contenu d'un fichier texte en Python ?
Lecture récursive de dossiers Python : surmonter l'exploration superficielle
Dans le domaine de la programmation, il est souvent difficile de naviguer efficacement dans des structures hiérarchiques complexes. Pour un passionné de Python en herbe avec une expérience en C/Obj-C, parcourir de manière récursive une structure de dossiers pour lire le contenu de fichiers texte peut constituer un formidable obstacle.
Plongeons dans le code que vous avez fourni pour comprendre les limitations qui empêchent sa récursion au-delà d'une seule profondeur de dossier :
<code class="python">import os import sys rootdir = sys.argv[1] for root, subFolders, files in os.walk(rootdir): for folder in subFolders: outfileName = rootdir + "/" + folder + "/py-outfile.txt" # hardcoded path folderOut = open( outfileName, 'w' ) print "outfileName is " + outfileName for file in files: filePath = rootdir + '/' + file f = open( filePath, 'r' ) toWrite = f.read() print "Writing '" + toWrite + "' to" + filePath folderOut.write( toWrite ) f.close() folderOut.close()</code>
Le coupable réside dans le chemin codé en dur pour filePath :
<code class="python">filePath = rootdir + '/' + file</code>
Ce code suppose une profondeur fixe d'un dossier, l'empêchant de fonctionner correctement extraire les chemins de fichiers dans des dossiers imbriqués. Pour résoudre ce problème, nous devons incorporer la valeur racine actuelle, qui fournit le chemin du dossier actuellement itéré :
<code class="python">filePath = os.path.join(root, file)</code>
En utilisant os.path.join, nous construisons un chemin de fichier complet précis, permettant le code pour explorer avec succès tous les niveaux de la structure des dossiers.
De plus, il est prudent d'utiliser l'instruction with pour gérer les opérations sur les fichiers, ce qui garantit la fermeture automatique des fichiers, améliore la lisibilité du code et réduit les fuites potentielles de ressources.
Voici une version révisée du code qui résout ces problèmes :
<code class="python">import os import sys walk_dir = sys.argv[1] print('walk_dir = ' + walk_dir) # Converting to absolute path ensures portability walk_dir = os.path.abspath(walk_dir) print('walk_dir (absolute) = ' + walk_dir) for root, subdirs, files in os.walk(walk_dir): print('--\nroot = ' + root) list_file_path = os.path.join(root, 'my-directory-list.txt') print('list_file_path = ' + list_file_path) with open(list_file_path, 'wb') as list_file: for subdir in subdirs: print('\t- subdirectory ' + subdir) for filename in files: file_path = os.path.join(root, filename) print('\t- file %s (full path: %s)' % (filename, file_path)) with open(file_path, 'rb') as f: f_content = f.read() list_file.write(('The file %s contains:\n' % filename).encode('utf-8')) list_file.write(f_content) list_file.write(b'\n')</code>
Avec ces modifications, votre code Python
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!