Python生成目录树
- 1、CMD生成目录树
- 1.1 查看帮助
- 1.2 作用
- 1.3 命令格式
- 2、Python生成目录树
- 2.1 标准库pathlib介绍
- 2.2 代码实现
- 2.3 改进,显示指定目录
- 2.4 改进,保存文本文件
- 2.5 改进,封装
- 3、其他想法
在写一些文章时,尤其是一些技术文章或者教程,有时需要将目录结构附在文中,最简单粗暴的方法是自己手动写,但是效率太低,今天就来介绍一下高效率、美观的方法。
1、CMD生成目录树
在 windows 系统中,有一个 CMD 指令可以生成目录树,该条指令是 “tree” 。
1.1 查看帮助
使用 “Win+R” 快捷键调出运行 对话框,然后输入 ”CMD“ 回车打开命令行窗口。可以在窗口中输入 ”tree /?” 查看:
以图形显示驱动器或路径的文件夹结构。TREE [drive:][path] [/F] [/A]/F 显示每个文件夹中文件的名称。/A 使用 ASCII 字符,而不使用扩展字符。
1.2 作用
从上述帮助文档中可以看出 tree 命令的作用是“以图形显示驱动器或路径的文件夹结构”。
1.3 命令格式
如果我们只想在命令行窗口查看 文件夹目录结构,可以使用如下格式:
tree E:\Programming\Python\DesignPattern
输出内容如下:
注意:如果路径中含有空格,则路径需要用双引号包起来,例如tree "C:\Program Files"
。
上面的指令只能生成文件夹的目录结构,并没有显示文件,我们可以增加 /F
参数来显示文件夹和文件的目录结构:
tree /F E:\Programming\Python\DesignPattern
这样就ok了:
上述命令只是在控制台打印出来了,有时候会有保存到文件的需求,只需对上述命令稍作修改:
tree /F E:\Programming\Python\DesignPattern > dirtree.txt
命令执行之后,在命令行所在目录下会生成一个名为 “dirtree.txt” 的文件,目录结构已在其中。
2、Python生成目录树
上述 CMD 方式虽然可以生成目录树,但是并不美观,让我们用 Python 实现。
2.1 标准库pathlib介绍
Python有一个标准文件路径处理库 os.path ,从 Python3.4 开始,Python 又加入了一个标准库 pathlib ,该库是跨平台的、面向对象的路径操作库。
本例使用了 pathlib 中的 Path 类。本文用到的一些基本操作如下:
Path 类的引入:
from pathlib import Path
创建 Path 对象:
p = Path('E:\Programming\Python\DesignPattern')
获取 p 的路径名称:
print(p.name)
获取 p 目录下的所有文件:
pit = p.iterdir() # 返回一个迭代器,包含p下所有文件夹和文件
判断 p 是不是文件:
print(p.is_file())
判断 p 是不是目录:
print(p.is_dir())
2.2 代码实现
思路:给出一个路径,判断是否为文件,如果是,则字符串拼接;否则,字符串拼接并且递归查询该目录下的文件。字符串拼接的时候以缩进来显示层次结构。
tree_str = ''def generate_tree(pathname, n=0):global tree_strif pathname.is_file():tree_str += ' |' * n + '-' * 4 + pathname.name + '\n'elif pathname.is_dir():tree_str += ' |' * n + '-' * 4 + \str(pathname.relative_to(pathname.parent)) + '\\' + '\n'for cp in pathname.iterdir():generate_tree(cp, n + 1)if __name__ == '__main__':generate_tree(Path.cwd())print(tree_str)
输出结果:
----PythonApplication\|----.ipynb_checkpoints\| |----01_generate_tree-checkpoint.ipynb|----01_generate_tree.ipynb
2.3 改进,显示指定目录
上述程序有一个缺点,就是执行时只能显示程序文件所在目录的目录树结构,想要生成其目录的目录树结构就需要将其拷贝到那个目录执行。这样很不方便,我们可以利用命令参数将目标路径传递给程序,然后进行显示。上述generate_tree() 不需要修改。执行部分改一下:
if __name__ == '__main__':# 命令参数个数为2并且目录存在存在if len(sys.argv) == 2 and Path(sys.argv[1]).exists():generate_tree(Path(sys.argv[1]), 0)else: # 当前路径generate_tree(Path.cwd(), 0)print(tree_str)
修改以后,可以在命令行中添加目录参数了:
python dirtree.py E:\Programming\Python\applications
执行结果如图所示:
2.4 改进,保存文本文件
以上实现了在控制台打印的功能,但是缺少保存文件的功能,没关系,下面就来实现。
定义保存文件函数:
def save_file(tree, filename='tree.txt'):with open(filename, 'w', encoding='utf-8') as f:f.write(tree)
修改命令行参数解析部分:
if __name__ == '__main__':# 命令参数个数为2并且目录存在存在if len(sys.argv) == 2 and Path(sys.argv[1]).exists():generate_tree(Path(sys.argv[1]), 0)# 命令参数个数为3并且目录存在存在if len(sys.argv) == 3 and Path(sys.argv[1]).exists():generate_tree(Path(sys.argv[1]), 0)save_file(tree_str, sys.argv[2])else: # 当前路径generate_tree(Path.cwd(), 0)print(tree_str)
修改完毕之后,可以使用下面命令测试:
python dirtree.py E:\Programming\Python\applications dirtree.txt
执行完之后就会在该目录下生成 dirtree.txt 文件。
2.5 改进,封装
上述功能已经实现,但是用到了全局变量,既然是一个完整的功能不如封装成一个类。
# -*- coding: utf-8 -*-
import sys
from pathlib import Pathclass DirectionTree(object):"""生成目录树@ pathname: 目标目录@ filename: 要保存成文件的名称"""def __init__(self, pathname='.', filename='tree.txt'):super(DirectionTree, self).__init__()self.pathname = Path(pathname)self.filename = filenameself.tree = ''def set_path(self, pathname):self.pathname = Path(pathname)def set_filename(self, filename):self.filename = filenamedef generate_tree(self, n=0):if self.pathname.is_file():self.tree += ' |' * n + '-' * 4 + self.pathname.name + '\n'elif self.pathname.is_dir():self.tree += ' |' * n + '-' * 4 + \str(self.pathname.relative_to(self.pathname.parent)) + '\\' + '\n'for cp in self.pathname.iterdir():self.pathname = Path(cp)self.generate_tree(n + 1)def save_file(self):with open(self.filename, 'w', encoding='utf-8') as f:f.write(self.tree)if __name__ == '__main__':dirtree = DirectionTree()# 命令参数个数为1,生成当前目录的目录树if len(sys.argv) == 1:dirtree.set_path(Path.cwd())dirtree.generate_tree()print(dirtree.tree)# 命令参数个数为2并且目录存在存在elif len(sys.argv) == 2 and Path(sys.argv[1]).exists():dirtree.set_path(sys.argv[1])dirtree.generate_tree()print(dirtree.tree)# 命令参数个数为3并且目录存在存在elif len(sys.argv) == 3 and Path(sys.argv[1]).exists():dirtree.set_path(sys.argv[1])dirtree.generate_tree()dirtree.set_filename(sys.argv[2])dirtree.save_file()else: # 参数个数太多,无法解析print('命令行参数太多,请检查!')
同样可以使用以下三条命令进行测试:
python dirtree.py
:打印当前目录的目录树;python dirtree.py E:\Programming\Python\applications
:打印指定目录的目录树;python dirtree.py E:\Programming\Python\applications dirtree.txt
:打印指定目录的目录树并保存成文件。
3、其他想法
本来在改进部分还想要生成图片,但是经过一番测试遇到以下问题:
- 使用 PIL 库把目录树转换为图片:该库在生成图片的时候要指定图片的大小,我们知道目录树结构根据文件夹内容不定长度和高度,所以需要动态计算长度和高度。
- 使用 Pygame 库把目录树转换为图片:该库可以自适应宽度,但是不能识别换行符,所以最后生成的图片只有一行。
思路:
可以把目录树的每一行都生成一个图片,最后进行拼接,理论上可行,没有进行测试,有兴趣的可以尝试。
Python生成目录树相关推荐
- python生成目录树_Python生成目录树
更多: http://my.oschina.net/u/438371/blog/131956 1.[代码]gentrees.py #!/usr/bin/python # -*- coding: utf ...
- python学习 生成目录树
第一种最速方式,cmd直接用tree命令,如果还要文件用 tree /f C:\Users\ds>tree d:\9月考勤 > d:\test.xlsC:\Users\ds>tree ...
- Windows-tree命令生成目录树
tree命令生成目录树 2K以上的操作系统中都带有tree命令,98下面没有,就算是把2K下面的拷过去也用不起来. tree命令的格式是tree [drive][path] [/F] [/A] /F ...
- tree命令生成目录树
tree命令生成目录树 1. tree背景 2. tree安装 3. tree说明 4. tree使用 1. tree背景 在项目设计文档时经常需要对项目结构进行说明,如果能生成目录树结构则是对项目结 ...
- oracle 生成目录树,根据路径列和标题列生成目录树 - Foxtable 中文帮助文档
根据路径列和标题列生成目录树 有的时候,目录树要根据两列内容生成,一列指定路径,一列指定标题,根据两列内容生成目录树需要使用GenerateTree方法. 语法: GenerateTree(DataT ...
- python遍历目录树_在Python中遍历目录树的速度要快得多?
假设给定目录树的大小是合理的:比如Twisted或Python这样的开源项目,遍历和迭代该目录中所有文件/目录的绝对路径的最快方式是什么? 我想在Python中完成这项工作.os.path.walk很 ...
- oracle 生成目录树,jQuery zTree插件快速实现目录树
ztree是JQuery的一个开源树形目录的插件,用来快速构建网站的树形目录结构,并且提供了功能丰富,利于扩展的API. JQuery ztree官网 只要引入jquery和ztree的库js,然后给 ...
- Linux - tree 生成目录树「Note」
概览 tree 安装 tree 可选参数 tree 常用参数 win 配置 tree 安装 #Debian apt-get install tree#Ubuntu apt-get install tr ...
- python生成环形树状图-networkx
一,项目简介: 利用networkx官方中的CircularTree案例,修改节点的名称,利用唐代诗人姓名与其诗作中的关键字生成的边,形成以诗人关键字为代表的三层环形树状图. 附上原官方的Circul ...
最新文章
- usaco contact
- linux arm gcc 内联汇编参考手册
- 单链表C/C++实现(数据结构严蔚敏)
- Android中使用Adapter(适配器)给RecycleView设置数据源
- Oracle 同义词、DBLINK、表空间的使用
- 树的存储结构以及实现代码
- 高性能微服务网关.NETCore客户端Kong.Net开源发布
- 漏洞升级?黑客可利用 Spring 框架漏洞部署 Mirai 恶意软件
- 联想在华为背后“捅刀”?谁在让 5G 标准投票成闹剧
- OpenCV-向上采样cv::pyrUp向下采样cv::pyrDown
- pycharm背景图片的设置
- 2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用
- virtualbox下宿主机与虚拟机互通
- 遍历JSON的三种方法
- Mysql(2)事务
- 在linux上使用spi-lcd屏 ST7735
- 网页 Failed to initialize player‘s 3D settings 小游戏4399 修复
- mysql查询学校开设总课程数_MYSQL数据库课程设计
- GNU的C++代码书写规范,C语言之父Dennis Ritchie亲自修订 (转)
- ArcGIS地理数据处理高级教程_002_2初识地理处理工具