180 votes

Lister la structure arborescente d'un répertoire en python ?

Je sais que nous pouvons utiliser os.walk() pour lister tous les sous-répertoires ou tous les fichiers d'un répertoire. Cependant, j'aimerais lister le contenu complet de l'arborescence d'un répertoire :

- Subdirectory 1:
   - file11
   - file12
   - Sub-sub-directory 11:
         - file111
         - file112
- Subdirectory 2:
    - file21
    - sub-sub-directory 21
    - sub-sub-directory 22    
        - sub-sub-sub-directory 221
            - file 2211

Quelle est la meilleure façon d'y parvenir en Python ?

0voto

MiniQuark Points 8927

Un autre tree() avec quelques fonctionnalités que je trouve utiles :

  • Set (jeu de mots) max_files pour limiter le nombre de fichiers par répertoire
  • Set (jeu de mots) max_level pour limiter la profondeur
  • Set (jeu de mots) sort_by pour trier les fichiers et les répertoires, par exemple sort_by=os.path.getmtime pour trier par date de dernière modification. La valeur par défaut est le tri par nom. Notez que les répertoires sont toujours affichés avant les fichiers.
  • Set (jeu de mots) indent pour définir le nombre d'espaces par niveau d'indentation, la valeur par défaut étant 4.

    from pathlib import Path

    def tree(path, , indent=4, max_files=None, sort_by=None, level=0, max_level=None): path = Path(path) if not path.is_dir(): return indent_str = " " indent level print(f"{indent_str}{path.name}/") sub_indent_str = " " indent * (level + 1) dir_content = list(path.iterdir()) subdirs = [filepath for filepath in dir_content if filepath.is_dir()] files = [filepath for filepath in dir_content if not filepath in subdirs] if max_level is not None and level < max_level: for subdir in sorted(subdirs, key=sort_by): tree(subdir, indent=indent, max_files=max_files, sort_by=sort_by, level=level + 1, max_level=max_level) for idx, filepath in enumerate(sorted(files, key=sort_by)): if max_files is not None and idx >= max_files: print(f"{sub_indent_str}...") break print(f"{sub_indent_str}{filepath.name}")

Exemple de sortie :

some_path/
    some_subdir/
    another_subdir/
        foo.txt
        bar.txt
    big_subdir/
        a00001.txt
        a00002.txt
        a00003.txt
        ...
    deeply_nested/
        max_depth1/
        max_depth2/

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