Maison >développement back-end >Tutoriel Python >Comment parcourir de manière récursive une structure de dossiers pour lire le contenu d'un fichier texte en Python ?

Comment parcourir de manière récursive une structure de dossiers pour lire le contenu d'un fichier texte en Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-18 14:36:44813parcourir

How to Recursively Traverse a Folder Structure to Read Text File Contents in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn