为了把某个目录下的所有子目录文件夹和文件全部显示出来,我们可以绘制一个文件夹目录树。文件夹目录树可以采用层级列表的方式呈现,也可以绘制成思维导图。在这个系列文章里,我将推送3篇文章,分别给大家演示制作文件夹目录树层级列表的方法,和分别使用列表和字典存储文件夹目录树,绘制思维导图的方法。
下面,就请跟着我,一起体验这场编程之旅吧。
素材准备:
任意选中计算机中某个包含多个子目录的文件夹作为根目录即可。
项目目标:
输出某个文件夹目录树的层级列表:
1. 使用列表存储文件夹目录树的各个结点信息;
2. 递归构造文件夹目录树;
3. 递归输出文件夹目录树层级列表。
项目实施过程:
一、准备工作。
1. 数据结构说明:
抽象数据结构(广义表):(A(B(E, F), C(G), D))
实际数据结构(列表):
['A', ['B', ['E'], ['F.txt']], ['C', ['G.txt']], ['D.txt']]
2. 重要方法说明:
os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。
语法格式:os.listdir(path)
参数:path -- 需要列出的目录路径
返回值:返回指定路径下的文件和文件夹列表。
os.path.isdir(path)方法用于判断路径是否为目录。
3. 算法思想说明:
递归算法:在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。如果数据的结构形式是按递归定义的(如二叉树、广义表等),则可以设计递归函数,采用递归算法构造和访问该数据结构。
递归函数:如果一个函数直接或间接调用自身,这个函数就叫做递归函数。递归函数包含递归体和递归出口两个部分,在每次调用自身进入下一层时,必须越来越接近递归出口;到达递归出口后,则结束程序或返回上一层。
二、主函数代码说明。
1. 读取以path为根目录的文件夹目录树到列表all_files中,并递归构造广义表:
import ospath = "A/"all_files = [path[:-1]]create_files(all_files, path)
注释:先设置all_files = [path[:-1]],表示将根目录的文件名"A"存储到列表all_files中;之后调用自定义函数create_files(all_files, path),递归构造列表all_files。
2. 递归输出广义表:
show_files(all_files, 0)
注释:调用自定义函数show_files(all_files, 0),递归输出列表all_files。
三、递归构造文件夹目录树
1. 函数说明:
若当前根结点是文件夹,则遍历其子目录,将子目录中的文件夹和文件作为新的结点添加到列表files中,并依次递归处理每一个子目录。
2. 自定义函数解析:
'''函数功能:递归构造文件夹目录树的各个节点,根节点与其子节点共同组成一个列表files,其中files[0]存储根节点,其值是一个字符串(目录名称);files[1:]存储各个子节点及其后代,每个子节点家族又都是一个列表(若该子节点没有后代,则所在列表只有一个元素,该元素值为子节点对应文件或空目录的名称),如此递归构成整个文件夹目录树。函数名:create_files(files:list, path:str)参数表:files -- 用来存储当前目录(根节点)及其子目录节点的列表,其中files[0]已经存储了根节点,若根节点的子节点不为空,则将各子节点添加到列表files中; path -- 当前目录的路径,只有知道了具体的路径才能处理文件和目录。返回值:files是可变对象,没有返回值。'''def create_files(files:list, path:str): if os.path.isdir(path): for file in os.listdir(path): files.append([file]) new_path = path + "/" + file if os.path.isdir(new_path): create_files(files[-1], new_path)
四、递归输出文件夹目录树层级列表
1. 函数说明:
函数功能:递归遍历(先根顺序)文件夹目录树的各个节点。先输出根目录结点的名称files[0],再遍历其子目录files[1:],依次递归输出其子目录的名称。2. 自定义函数解析:
'''函数功能:递归遍历(先根顺序)文件夹目录树的各个节点。先输出根目录结点的名称files[0],再遍历其子目录files[1:],依次递归输出其子目录的名称。函数名:show_files(files:list, step:int)参数表:files -- 用来存储当前目录(根节点)及其子目录节点的列表; step -- 表示当前节点所属层级。返回值:只输出结点信息,没有返回值。'''def show_files(files:list, step:int): print(step * " ", files[0]) for file in files[1:]: show_files(file, step+1)
四、课后思考
使用海龟绘图绘制文件夹目录树,思考:
1.如何存储个结点的位置坐标?
2.如何绘制矩形方框和折线?
结语:
好了,到这里,就把“输出某个文件夹目录树的层级列表”各个模块的功能和代码实现都给大家做了详细的分析了。下节课我们一起来回答课后思考中的问题,实现使用海龟绘图绘制文件夹目录树功能。 因为本项目的数据结构和算法原理都是自己闭门造车弄出来的,难免存在不足之处,欢迎各位老师批评指正。当然,如果你是新手,需要完整的代码,那可以加入“Python算法之旅”知识星球,下载完整的源代码。需要本文word版的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注Python算法,感兴趣就一起来!
相关优秀文章:
阅读代码和写更好的代码
最有效的学习方式