Domanda Elenca la struttura ad albero delle directory in python?


So che possiamo usare os.walk () per elencare tutte le sottodirectory o tutti i file in una directory. Tuttavia, vorrei elencare il contenuto completo dell'albero della directory:

  • Sottodirectory 1:
    • file11
    • file12
    • Sotto-sottodirectory 11:
      • file111
      • file112
  • Sottodirectory 2:
    • file21
    • sotto-sottodirectory 21
    • sotto-sottodirectory 22
      • sotto-sotto-sottodirectory 221
        • file 2211

Come raggiungere al meglio questo in Python?


47
2018-03-15 20:29


origine


risposte:


Ecco una funzione per farlo con la formattazione:

import os

def list_files(startpath):
    for root, dirs, files in os.walk(startpath):
        level = root.replace(startpath, '').count(os.sep)
        indent = ' ' * 4 * (level)
        print('{}{}/'.format(indent, os.path.basename(root)))
        subindent = ' ' * 4 * (level + 1)
        for f in files:
            print('{}{}'.format(subindent, f))

79
2018-03-15 21:29



Una soluzione senza il tuo rientro:

for path, dirs, files in os.walk(path):
  print path
  for f in files:
    print f

os.walk esegue già la camminata top-down e in profondità che stai cercando.

Ignorare l'elenco delle directory impedisce la sovrapposizione che menzioni.


17
2018-03-15 21:12



Sono venuto qui cercando la stessa cosa e ho usato dhobbs per me. Come ringraziamento alla community, ho aggiunto alcuni argomenti per scrivere su un file, come richiesto da akshay, e ho reso i file di visualizzazione opzionali, quindi non è un risultato un po 'troppo. Ha anche reso il rientro un argomento facoltativo in modo che tu possa cambiarlo, poiché alcuni preferiscono che sia 2 e altri preferiscano 4.

Utilizzato loop diversi in modo che quello che non mostra i file non controlli se deve su ogni iterazione.

Spero che aiuti qualcun altro come risposta di dhobbs mi ha aiutato. Molte grazie.

def showFolderTree(path,show_files=False,indentation=2,file_output=False):
"""
Shows the content of a folder in a tree structure.
path -(string)- path of the root folder we want to show.
show_files -(boolean)-  Whether or not we want to see files listed.
                        Defaults to False.
indentation -(int)- Indentation we want to use, defaults to 2.   
file_output -(string)-  Path (including the name) of the file where we want
                        to save the tree.
"""


tree = []

if not show_files:
    for root, dirs, files in os.walk(path):
        level = root.replace(path, '').count(os.sep)
        indent = ' '*indentation*(level)
        tree.append('{}{}/'.format(indent,os.path.basename(root)))

if show_files:
    for root, dirs, files in os.walk(path):
        level = root.replace(path, '').count(os.sep)
        indent = ' '*indentation*(level)
        tree.append('{}{}/'.format(indent,os.path.basename(root)))    
        for f in files:
            subindent=' ' * indentation * (level+1)
            tree.append('{}{}'.format(subindent,f))

if file_output:
    output_file = open(file_output,'w')
    for line in tree:
        output_file.write(line)
        output_file.write('\n')
else:
    # Default behaviour: print on screen.
    for line in tree:
        print line

8
2017-08-23 14:12



Basato su questo fantastico post

http://code.activestate.com/recipes/217212-treepy-graphically-displays-the-directory-structur/

Ecco una raffinatezza per comportarsi esattamente come

http://linux.die.net/man/1/tree

#! / usr / bin / env python2
# - * - codifica: utf-8 - * -

# tree.py
#
# Scritto da Doug Dahms
#
# Stampa la struttura ad albero per il percorso specificato sulla riga di comando

da os import listdir, sep
da os.path import abspath, basename, isdir
da sys import argv

def tree (dir, padding, print_files = False, isLast = False, isFirst = False):
    se isFirst:
        print padding.decode ('utf8') [: - 1] .encode ('utf8') + dir
    altro:
        se isLast:
            print padding.decode ('utf8') [: - 1] .encode ('utf8') + '└──' + basename (abspath (dir))
        altro:
            print padding.decode ('utf8') [: - 1] .encode ('utf8') + '├──' + basename (abspath (dir))
    files = []
    se print_files:
        files = listdir (dir)
    altro:
        files = [x per x in listdir (dir) se isdir (dir + sep + x)]
    se non è il primo:
        padding = padding + ''
    files = ordinati (file, chiave = lambda s: s.lower ())
    conteggio = 0
    last = len (file) - 1
    per i, file in enumerate (file):
        conta + = 1
        percorso = dir + sep + file
        isLast = i == last
        se isdir (percorso):
            se conta == len (file):
                se isFirst:
                    albero (percorso, padding, print_files, isLast, False)
                altro:
                    albero (percorso, padding + '', print_files, isLast, False)
            altro:
                albero (percorso, padding + '│', print_files, isLast, False)
        altro:
            se isLast:
                stampa padding + '└──' + file
            altro:
                stampa padding + '├──' + file

uso def ():
    return '' 'Uso:% s [-f]
Stampa la struttura ad albero del percorso specificato.
Opzioni:
-f Stampa file e directory
PERCORSO Percorso per elaborare '' '% basename (argv [0])

def main ():
    se len (argv) == 1:
        utilizzo della stampa ()
    elif len (argv) == 2:
        # stampa solo le directory
        percorso = argv [1]
        se isdir (percorso):
            tree (path, '', False, False, True)
        altro:
            print 'ERRORE: \' '+ percorso +' \ 'non è una directory'
    elif len (argv) == 3 e argv [1] == '-f':
        # stampa directory e file
        percorso = argv [2]
        se isdir (percorso):
            tree (path, '', True, False, True)
        altro:
            print 'ERRORE: \' '+ percorso +' \ 'non è una directory'
    altro:
        utilizzo della stampa ()

se __name__ == '__main__':
    principale()



4
2018-03-27 23:07



Sopra a dhobbs rispondi sopra (https://stackoverflow.com/a/9728478/624597), ecco una funzionalità extra di memorizzazione dei risultati in un file (io personalmente la uso per copiare e incollare Mente libera per avere una bella panoramica della struttura, quindi ho usato le tabulazioni invece degli spazi per il rientro):

import os

def list_files(startpath):

    with open("folder_structure.txt", "w") as f_output:
        for root, dirs, files in os.walk(startpath):
            level = root.replace(startpath, '').count(os.sep)
            indent = '\t' * 1 * (level)
            output_string = '{}{}/'.format(indent, os.path.basename(root))
            print(output_string)
            f_output.write(output_string + '\n')
            subindent = '\t' * 1 * (level + 1)
            for f in files:
                output_string = '{}{}'.format(subindent, f)
                print(output_string)
                f_output.write(output_string + '\n')

list_files(".")

1
2017-07-28 10:51



Forse più veloce di @ellockie (forse)

importazione os
def file_writer (testo):
    con open ("folder_structure.txt", "a") come f_output:
        f_output.write (testo)
def file_file (percorso iniziale):


    per root, dirs, file in os.walk (startpath):
        level = root.replace (startpath, '') .count (os.sep)
        indent = '\ t' * 1 * (livello)
        output_string = '{} {} / \ n'.format (indent, os.path.basename (root))
        file_writer (output_string)
        subindent = '\ t' * 1 * (livello + 1)
        output_string = '% s% s \ n'% (sottoindent, [f per f nei file])
        file_writer ( ''. join (output_string))


list_files ( "/")

Modifica: Sono stato testato screenshot è che:

enter image description here


1
2017-11-15 08:06



Puoi eseguire il comando 'tree' della shell di Linux.

Installazione:

   ~$sudo apt install tree

Usando in python

    >>> import os
    >>> os.system('tree <desired path>')

Esempio:

    >>> os.system('tree ~/Desktop/myproject')

Questo ti dà una struttura più pulita ed è visivamente più completa e facile da digitare.


0
2018-04-03 01:12