在Python中列出目录树结构?

我知道我们可以使用os.walk()来列出目录中的所有子目录或所有文件。 不过,我想列出完整的目录树内容:

  • 子目录1:
    • FILE11
    • file12
    • 子目录11:
      • file111
      • file112
  • 子目录2:
    • file21
    • 子目录21
    • 子目录22
      • 子子目录221
        • 文件2211

如何在Python中最好地实现这一点?

这里有一个function来做到这一点格式化:

 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)) 

没有缩进的解决scheme:

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

os.walk已经做了自上而下,深度优先的步行你正在寻找。

忽略目录列表可以防止你提到的重叠。

我来到这里寻找同样的东西,并为我使用dhobbs的答案。 作为感谢社区的一种方式,我添加了一些参数来写入一个文件,正如akshay所问,并显示文件是可选的,所以它不是一个输出。 也使缩进一个可选的参数,所以你可以改变它,有些人喜欢它是2和其他人喜欢4。

使用不同的循环,所以没有显示文件不会检查是否必须在每次迭代。

希望它帮助别人,因为dhobbs的答案帮助了我。 非常感谢。

 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 

基于这个奇妙的职位

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

这里有一个完美的行为

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

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

 #tree.py
 #
 #道格·达姆斯写的
 #
 #打印命令行中指定path的树结构

从os导入listdir,sep
从os.path导入abspath,basename,isdir
从sysimportargv

 def tree(dir,padding,print_files = False,isLast = False,isFirst = False):
    如果isFirst:
         print padding.decode('utf8')[: -  1] .encode('utf8')+ dir
    其他:
        如果isLast:
             print padding.decode('utf8')[: -  1] .encode('utf8')+'└──'+ basename(abspath(dir))
        其他:
             print padding.decode('utf8')[: -  1] .encode('utf8')+'├──'+ basename(abspath(dir))
     files = []
    如果print_files:
         files = listdir(dir)
    其他:
         files = [x for x in listdir(dir)if isdir(dir + sep + x)]
    如果不是isFirst:
         padding = padding +''
     files = sorted(files,key = lambda s:s.lower())
     count = 0
    最后= len(文件) -  1
    为我,枚举(文件)中的文件:
        计数+ = 1
        path= dir + sep +文件
         isLast = i ==最后
        如果isdir(path):
            如果count == len(文件):
                如果isFirst:
                    树(path,填充,print_files,isLast,False)
                其他:
                    树(path,填充+'',print_files,isLast,False)
            其他:
                树(path,填充+'│',print_files,isLast,False)
        其他:
            如果isLast:
                打印填充+'└──'+文件
            其他:
                打印填充+'├──'+文件

 def usage():
    返回'''用法:%s [-f] 
打印指定path的树结构。
选项:
 -f打印文件以及目录
 PATH处理'''%basename(argv [0])的path

 def main():
    如果len(argv)== 1:
        打印用法()
     elif len(argv)== 2:
         #打印只是目录
         path = argv [1]
        如果isdir(path):
            树(path,'',False,False,True)
        其他:
            打印'错误:\''+path+'\'不是一个目录'
     elif len(argv)== 3和argv [1] =='-f':
         #打印目录和文件
         path = argv [2]
        如果isdir(path):
            树(path,'',真,假,真)
        其他:
            打印'错误:\''+path+'\'不是一个目录'
    其他:
        打印用法()

如果__name__ =='__main__':
    主要()


在上面的dhobbs( https://stackoverflow.com/a/9728478/624597 )上面的回答,这里是一个额外的function将结果存储到一个文件(我个人使用它来复制和粘贴到FreeMind有一个很好的概述结构,因此我使用制表符而不是空格缩进):

 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(".") 

也许比@ellockie(也许)

import操作系统
 def file_writer(文本):
    打开(“folder_structure.txt”,“a”)作为f_output:
         f_output.write(文本)
 def list_files(startpath):


     for root,dirs,os.walk(startpath)中的文件:
         level = root.replace(startpath,'').count(os.sep)
         indent ='\ t'* 1 *(level)
         output_string ='{} {} / \ n'.format(indent,os.path.basename(root))
         file_writer(output_string)
         subindent ='\ t'* 1 *(level + 1)
         output_string ='%s%s \ n'%(subindent,[f for f in files])
         file_writer( ''。join(output_string))


 list_files( “/”)

编辑:我testing过的截图是这样的:

在这里输入图像描述