Maison >développement back-end >Tutoriel Python >Comment puis-je personnaliser la sortie de la fonction os.walk() de Python pour créer une liste de répertoires imbriqués ?

Comment puis-je personnaliser la sortie de la fonction os.walk() de Python pour créer une liste de répertoires imbriqués ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-08 15:57:021098parcourir

How Can I Customize the Output of Python's os.walk() Function to Create a Nested Directory Listing?

Utilisation de os.walk() pour parcourir récursivement des répertoires en Python : un guide détaillé

Introduction

La fonction os.walk() de Python fournit un mécanisme puissant pour parcourir de manière récursive les arborescences de répertoires. Il parcourt tous les répertoires et fichiers d'un répertoire spécifié, ce qui en fait un outil essentiel pour des tâches telles que la gestion de fichiers et l'exploration de répertoires.

Problème : personnalisation de la sortie de la liste des répertoires

Pour démontrer les capacités de os.walk(), considérons le scénario suivant : vous souhaitez naviguer de manière récursive à partir du répertoire racine et imprimer une liste personnalisée de répertoires et de fichiers, y compris les répertoires imbriqués. niveaux.

Code initial et O/P

En utilisant le code suivant :

import os
import fnmatch

for root, dir, files in os.walk("."):
    print(root)
    print("")
    for items in fnmatch.filter(files, "*"):
        print("..." + items)
    print("")

Vous obtenez le résultat suivant :

.

...Python_Notes
...pypy.py
...pypy.py.save
...classdemo.py
....goutputstream-J9ZUXW
...latest.py
...pack.py
...classdemo.pyc
...Python_Notes~
...module-demo.py
...filetype.py

./packagedemo

...classdemo.py
...__init__.pyc
...__init__.py
...classdemo.pyc

Cependant, cette sortie ne répond pas au format souhaité de :

A
---a.txt
---b.txt
---B
------c.out

Solution

Pour personnaliser la sortie, une approche améliorée est nécessaire. Le code suivant obtient le format souhaité :

import os

# traverse root directory, and list directories as dirs and files as files
for root, dirs, files in os.walk("."):
    path = root.split(os.sep)
    print((len(path) - 1) * '---', os.path.basename(root))
    for file in files:
        print(len(path) * '---', file)

Explication

Ce code utilise la logique suivante :

  1. Il divise la racine chemin dans un chemin de liste en utilisant le séparateur de répertoire du système d'exploitation (par exemple, « / » sur UNIX).
  2. Il imprime le nom de base du répertoire courant avec le nombre approprié de traits d'union, représentant son niveau d'imbrication.
  3. Il parcourt les fichiers du répertoire courant et imprime chaque fichier avec son niveau d'imbrication.

Sortie

Utilisation de cette amélioration code, vous obtiendrez le résultat souhaité :

A
---a.txt
---b.txt
---B
------c.out

Dans cette sortie, A et B représentent des répertoires, tandis que a.txt, b.txt et c.out représentent des fichiers. Le nombre de préfixes tirets indique le niveau d'imbrication de chaque élément.

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