• 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生成目录树相关推荐

  1. python生成目录树_Python生成目录树

    更多: http://my.oschina.net/u/438371/blog/131956 1.[代码]gentrees.py #!/usr/bin/python # -*- coding: utf ...

  2. python学习 生成目录树

    第一种最速方式,cmd直接用tree命令,如果还要文件用 tree /f C:\Users\ds>tree d:\9月考勤 > d:\test.xlsC:\Users\ds>tree ...

  3. Windows-tree命令生成目录树

    tree命令生成目录树 2K以上的操作系统中都带有tree命令,98下面没有,就算是把2K下面的拷过去也用不起来. tree命令的格式是tree [drive][path] [/F] [/A] /F ...

  4. tree命令生成目录树

    tree命令生成目录树 1. tree背景 2. tree安装 3. tree说明 4. tree使用 1. tree背景 在项目设计文档时经常需要对项目结构进行说明,如果能生成目录树结构则是对项目结 ...

  5. oracle 生成目录树,根据路径列和标题列生成目录树 - Foxtable 中文帮助文档

    根据路径列和标题列生成目录树 有的时候,目录树要根据两列内容生成,一列指定路径,一列指定标题,根据两列内容生成目录树需要使用GenerateTree方法. 语法: GenerateTree(DataT ...

  6. python遍历目录树_在Python中遍历目录树的速度要快得多?

    假设给定目录树的大小是合理的:比如Twisted或Python这样的开源项目,遍历和迭代该目录中所有文件/目录的绝对路径的最快方式是什么? 我想在Python中完成这项工作.os.path.walk很 ...

  7. oracle 生成目录树,jQuery zTree插件快速实现目录树

    ztree是JQuery的一个开源树形目录的插件,用来快速构建网站的树形目录结构,并且提供了功能丰富,利于扩展的API. JQuery ztree官网 只要引入jquery和ztree的库js,然后给 ...

  8. Linux - tree 生成目录树「Note」

    概览 tree 安装 tree 可选参数 tree 常用参数 win 配置 tree 安装 #Debian apt-get install tree#Ubuntu apt-get install tr ...

  9. python生成环形树状图-networkx

    一,项目简介: 利用networkx官方中的CircularTree案例,修改节点的名称,利用唐代诗人姓名与其诗作中的关键字生成的边,形成以诗人关键字为代表的三层环形树状图. 附上原官方的Circul ...

最新文章

  1. usaco contact
  2. linux arm gcc 内联汇编参考手册
  3. 单链表C/C++实现(数据结构严蔚敏)
  4. Android中使用Adapter(适配器)给RecycleView设置数据源
  5. Oracle 同义词、DBLINK、表空间的使用
  6. 树的存储结构以及实现代码
  7. 高性能微服务网关.NETCore客户端Kong.Net开源发布
  8. 漏洞升级?黑客可利用 Spring 框架漏洞部署 Mirai 恶意软件
  9. 联想在华为背后“捅刀”?谁在让 5G 标准投票成闹剧
  10. OpenCV-向上采样cv::pyrUp向下采样cv::pyrDown
  11. pycharm背景图片的设置
  12. 2018-2019-2 网络对抗技术 20165322 Exp5 MSF基础应用
  13. virtualbox下宿主机与虚拟机互通
  14. 遍历JSON的三种方法
  15. Mysql(2)事务
  16. 在linux上使用spi-lcd屏 ST7735
  17. 网页 Failed to initialize player‘s 3D settings 小游戏4399 修复
  18. mysql查询学校开设总课程数_MYSQL数据库课程设计
  19. GNU的C++代码书写规范,C语言之父Dennis Ritchie亲自修订 (转)
  20. ArcGIS地理数据处理高级教程_002_2初识地理处理工具

热门文章

  1. 计算机应用稿件改后重审,计算机应用实习实训的计划.doc
  2. 海泰方圆精彩亮相第六届中国人工智能与大数据海南高峰论坛
  3. 【线性代数】从矩阵分块的角度理解矩阵乘法
  4. 如何用xinstall实现h5唤起app
  5. SolidWorks 2022安装好后无法获得下列许可SOLIDWORKS Standard
  6. 函数指针三种定义与使用方式
  7. R:ggplot2(16),第8章 精雕细琢(1)
  8. 高等数学常见面试问题总结,含答案
  9. 双十一换个更漂亮的机箱,星曜者DF800上手
  10. 虚拟ip设置 - Keepalived详解