简单粗暴,用python生成目录树 |
您所在的位置:网站首页 › 软件项目目录结构怎么写 › 简单粗暴,用python生成目录树 |
在写一些文章时,尤其是一些技术文章或者教程,有时需要将目录结构附在文中,最简单粗暴的方法是自己手动写,但是效率太低,今天就来介绍一下高效率、美观的方法。 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_str if 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 Path class DirectionTree(object): """生成目录树 @ pathname: 目标目录 @ filename: 要保存成文件的名称 """ def __init__(self, pathname='.', filename='tree.txt'): super(DirectionTree, self).__init__() self.pathname = Path(pathname) self.filename = filename self.tree = '' def set_path(self, pathname): self.pathname = Path(pathname) def set_filename(self, filename): self.filename = filename def 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 库把目录树转换为图片:该库可以自适应宽度,但是不能识别换行符,所以最后生成的图片只有一行。 思路: 可以把目录树的每一行都生成一个图片,最后进行拼接,理论上可行,没有进行测试,有兴趣的可以尝试。 — End — 更多Python视频、源码、资料加群725638078免费获取 原文链接:https://juejin.im/post/5af1080a5188256727745b7d? |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |