Python生成目录树

article/2025/7/30 5:43:19

  • 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

输出内容如下:

01_tree只打印文件夹结构

注意:如果路径中含有空格,则路径需要用双引号包起来,例如tree "C:\Program Files"

上面的指令只能生成文件夹的目录结构,并没有显示文件,我们可以增加 /F 参数来显示文件夹和文件的目录结构:

tree /F E:\Programming\Python\DesignPattern

这样就ok了:

02_tree显示文件夹和文件结构

上述命令只是在控制台打印出来了,有时候会有保存到文件的需求,只需对上述命令稍作修改:

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

执行结果如图所示:

03_命令行带路径

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 库把目录树转换为图片:该库可以自适应宽度,但是不能识别换行符,所以最后生成的图片只有一行。

思路:

可以把目录树的每一行都生成一个图片,最后进行拼接,理论上可行,没有进行测试,有兴趣的可以尝试。

这里写图片描述


http://chatgpt.dhexx.cn/article/aWiGUki3.shtml

相关文章

C# treeView展示目录树

使用treeView控件展示目录树列表,并进行一系列的操作。 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; us…

vue 滚动目录树

要做这样一个目录树&#xff0c;先确定一下它的功能 1、点击目录按钮的时候&#xff0c;蓝点滑到点击的位置 2、页面滚动到点击按钮所对应的位置 3、页面滚动时&#xff0c;目录树的蓝点随着滚动条滚动 第一个功能&#xff0c;用css来写 就可以完成 index部分 <div clas…

目录树生成

1.使用命令行生成目录树 打开所要生成目录树的路径&#xff0c;如“F:\电影”&#xff0c;输入cmd -> 回车&#xff0c; 弹出命令行工具&#xff0c;输入tree /f命令&#xff0c;回车&#xff0c;则会生成一个目录树结构。 2.使用目录树生成工具生成目录树 目录树生成工具…

文件夹自动生成目录树(批处理)

举例&#xff1a;将FreeRTOS文件夹下所有文件生成目录树结构 1.在FreeRTOS同级文件夹下&#xff0c;新建文本文件&#xff0c;命名为 《目录树生成器.txt》&#xff08;名字可自定义&#xff09; 2.在 《目录树生成器.txt》 中输入如下命令&#xff0c;同时将生成的目录文件命名…

关于目录树

目录树 所谓目录树&#xff0c;大概就是指这个样子&#xff1a; 其实这只是一种显示方式&#xff0c;要依赖于其他主体&#xff0c;并不是内容本身。 作为显示方式 Word中的目录树 word中&#xff0c;如果设置了各级标题&#xff0c;就可以通过大纲视图显示目录树&#…

目录树设计

目录树的内容&#xff0c;将使用 dtree 来构建。使用 dtree 后&#xff0c;设计的重点就不是树&#xff0c;而是树中节点的设计。节点设计的核心是节点 id 的设计&#xff0c;既要保证节点 id 的唯一性&#xff0c;还要 id 有明确的含义&#xff0c;并且永不重复。 事实上&…

通过命令方式查看目录树

文章目录 一、Windows上查看目录树&#xff08;一&#xff09;查看当前目录的目录树&#xff08;二&#xff09;查看指定目录的目录树&#xff08;三&#xff09;保存目录树到文本文件 二、CentOS上查看目录树&#xff08;一&#xff09;安装tree程序&#xff08;二&#xff09…

java实现多层级目录树详解

一&#xff0c;引言 在开发中&#xff0c;经常遇到前端需要实现一个多层级的目录树&#xff0c;那么后端就需要根据这种结构返回对应的数据&#xff0c;因此在这里记录一下本人在开发中是如何实现这个多层级的目录树。 二&#xff0c;建表建库 在建表时&#xff0c;需要注意…

Linux系统目录树结构以及解释

FHS标准 Filesystem Hierarchy Standard&#xff08;文件系统层次化标准&#xff09;的缩写&#xff0c;多数Linux版本采用这种文件组织形式&#xff0c;类似于Windows操作系统中c盘的文件目录&#xff0c;FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最…

目录树的构造

概述 ”树“在计算机的世界里是一个基本的数据结构&#xff0c;很多地方都能看到”树“的身影。最常见的应该是在各种软件和网页的菜单栏中&#xff0c;多层级的折叠其实就是以一棵树的形式进行展现的&#xff0c;如下图所示&#xff1a; 在树的层级和标签类别比较少&#xf…

兴安雪学运维之:目录树详解

极北之地&#xff0c;兴安之雪&#xff0c;老骥伏枥转战Linux运维&#xff0c;最近根据授课和大略看了FHS3.0&#xff0c;对Linux的目录有了初步的了解&#xff0c;怕人老忘性差&#xff0c;作以记录。 一、目录结构图 Linux的目录是一个倒置的树状结构&#xff0c;最顶层的目录…

【数据结构】B/B-树(目录树)

引言 关于B树的性质 一、B树的结构 二、B树的实现 #include<iostream> using namespace std; #if 1 //5分支Btree #define M 5 //奇数 #define MAXSIZE (M-1) //最多元素个数 #define MINSIZE (M/2) //最少元素个数 //B树 class Btree { public://关键码类型using KeyTy…

【Mybatis】Mybatis将String类型的0存到数据库中的number类型字段中,变成了空;

一、问题 Mybatis将String类型的0存到数据库中的number类型字段中&#xff0c;变成了空&#xff1b; 二、分析 自己写了一个自动写代码的脚本&#xff0c;带入springBatch后&#xff0c;读取文件时&#xff0c;少了序列号0-9的记录&#xff08;10笔一提交&#xff09;&#…

java取数据库number转String

2019独角兽企业重金招聘Python工程师标准>>> BigDecimal bigDecimal(BigDecimal)value; Long lbigDecimal.longValue(); String sbigDecimal.toString(); 转载于:https://my.oschina.net/u/2285090/blog/514110

字符串存入数据库date类型字段

有时候为了计算方便等原因需要将时间以date格式存入数据库&#xff0c;但是前台传过来的数据类型都是字符串&#xff0c;如果将字符串直接插入date类型的字段中会抛&#xff1a;ORA-01861: 文字与格式字符串不匹配。 前台页面有一个表单&#xff0c;如下所示&#xff1a; <…

2018年SCI论文--整合GEO数据挖掘完整复现 八 :STRING数据库构建蛋白质相互作用网络(PPI),cytoscape软件筛选hub基因

文章目录 论文地址STRING数据库PPI网络构建输入差异基因listPPI图保存结果 cytoscape软件筛选hub基因、功能模块输入“string_interactions”文件用cytohHubba插件&#xff0c;筛选top10 Hub基因生存分析用MCODE插件&#xff0c;筛选功能模块 论文地址 STRING数据库 PPI网络构…

string数据库使用和实践第三部分数据处理 流程-参数--后续分析

流程 1.首先要获取蛋白质列表&#xff08;单个/多个&#xff09; 格式&#xff1a;蛋白名称为一个占一行&#xff0c;或者氨基酸序列的通用格式。ID类别&#xff1a;可以为一种&#xff0c;可以为多种混合 2.在对应的数据框中输入蛋白质列表或者上传列表文件后&#xff0c;选择…

spring boot String类型json 存入数据库

效果图&#xff1a; 如图&#xff0c;string类型的json字符串&#xff0c;存入数据库&#xff0c;主要就是解析成map&#xff0c;遍历插入&#xff0c;不多说上干货&#xff1a; PostMapping(value "/currentConfig")public String saveSvConfig(RequestParam(&quo…

jpa @Convert list转String存入数据库

1.问题 list通过jpa直接存入数据库会报错这里需要进行转换 2.代码 1.dto对象 Entity Data Accessors(chain true) public class GameMatch {/*** 主键*/IdGeneratedValue(strategy GenerationType.IDENTITY)private Integer id;/*** 游戏id*/private Integer gameId;/*** …

string数据库使用和实践的第二部分网页展示http://string-db.org/

主页 protein-mode 该模式中&#xff0c;string数据库能够预测到特定物种中的某一个蛋白质的相互作用关系 通过该模式可以获取最多的特异性&#xff0c;但是覆盖面就会较小一些&#xff0c;原因是该模式中&#xff0c;string不会准确的去获取其他物种的直系同源物&#xff0c;取…