Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python生成目录树

Python生成目录树

作者头像
王强
发布于 2018-08-09 10:02:35
发布于 2018-08-09 10:02:35
5.6K00
举报
文章被收录于专栏:Python爬虫实战Python爬虫实战
运行总次数:0

在写一些文章时,尤其是一些技术文章或者教程,有时需要将目录结构附在文中,最简单粗暴的方法是自己手动写,但是效率太低,今天就来介绍一下高效率、美观的方法。

1、CMD生成目录树

在 windows 系统中,有一个 CMD 指令可以生成目录树,该条指令是 "tree" 。

1.1 查看帮助

使用 “Win+R" 快捷键调出运行 对话框,然后输入 ”CMD“ 回车打开命令行窗口。可以在窗口中输入 ”tree /?" 查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
以图形显示驱动器或路径的文件夹结构。
TREE [drive:][path] [/F] [/A]
   /F   显示每个文件夹中文件的名称。
   /A   使用 ASCII 字符,而不使用扩展字符。

1.2 作用

从上述帮助文档中可以看出 tree 命令的作用是“以图形显示驱动器或路径的文件夹结构”。

1.3 命令格式

如果我们只想在命令行窗口查看 文件夹目录结构,可以使用如下格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tree E:\Programming\Python\DesignPattern

输出内容如下:

01_tree只打印文件夹结构

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tree /F E:\Programming\Python\DesignPattern

这样就ok了:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 类的引入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pathlib import Path

创建 Path 对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p = Path('E:\Programming\Python\DesignPattern')

获取 p 的路径名称:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(p.name)

获取 p 目录下的所有文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pit = p.iterdir() # 返回一个迭代器,包含p下所有文件夹和文件

判断 p 是不是文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(p.is_file())

判断 p 是不是目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(p.is_dir())

2.2 代码实现

思路:给出一个路径,判断是否为文件,如果是,则字符串拼接;否则,字符串拼接并且递归查询该目录下的文件。字符串拼接的时候以缩进来显示层次结构。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
----PythonApplication\
    |----.ipynb_checkpoints\
    |    |----01_generate_tree-checkpoint.ipynb
    |----01_generate_tree.ipynb

2.3 改进,显示指定目录

上述程序有一个缺点,就是执行时只能显示程序文件所在目录的目录树结构,想要生成其目录的目录树结构就需要将其拷贝到那个目录执行。这样很不方便,我们可以利用命令参数将目标路径传递给程序,然后进行显示。上述generate_tree() 不需要修改。执行部分改一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

修改以后,可以在命令行中添加目录参数了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python dirtree.py E:\Programming\Python\applications

执行结果如图所示:

03_命令行带路径

2.4 改进,保存文本文件

以上实现了在控制台打印的功能,但是缺少保存文件的功能,没关系,下面就来实现。

定义保存文件函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def save_file(tree, filename='tree.txt'):
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(tree)

修改命令行参数解析部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

修改完毕之后,可以使用下面命令测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python dirtree.py E:\Programming\Python\applications dirtree.txt

执行完之后就会在该目录下生成 dirtree.txt 文件。

2.5 改进,封装

上述功能已经实现,但是用到了全局变量,既然是一个完整的功能不如封装成一个类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- 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 库把目录树转换为图片:该库可以自适应宽度,但是不能识别换行符,所以最后生成的图片只有一行。

思路:

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


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C与Python实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
求求你,别用 os.path 了
前段时间,在使用新版本的 Django 时,我发现了 settings.py 的第一行代码从
somenzz
2021/05/18
7620
求求你,别用 os.path 了
生成项目目录树
那么我们该怎么像大佬一样优秀呢?其实很简单,我们可以使用windows自带的 tree 命令。
Java那些事儿
2020/07/21
2.5K0
生成项目目录树
Python文件处理实用指南
对文件的操作算是Python中一个基础又重要的知识点了,无论是在爬虫、数据分析、Web开发,还是在编写图形界面、进行数据分析,都有可能需要用到文件相关的操作。
州的先生
2020/09/08
1.8K0
Python文件处理实用指南
python学习——python中命令行
python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问。命令行参数是调用某个程序时除程序名外的其他参数。
py3study
2020/01/06
6360
python pathlib模块的基本使用和总结
相比常用的 os.path而言,pathlib 对于目录路径的操作更简介也更贴近 Pythonic。但是它不单纯是为了简化操作,还有更大的用途。
叶庭云
2020/09/17
3.2K0
python   pathlib模块的基本使用和总结
一文去掌握python 中pathlib库
在python中,我们知道常用的路径的是os模块,这里给大家介绍一个新的模块-pathlib。
雷子
2022/05/21
1.1K0
一文去掌握python 中pathlib库
小说python的路径操作
在日常编码中,常常会有这些操作 在当前目录或用户目录下新建一个配置文件, 获取一个文件的路径或上级目录 这些都涉及路径操作 相信大家都使用过`os.path`来处理过,这个痛苦我想"谁用谁知道吧" 今天的主角`pathlib`就是来解决痛苦的... pathlib简介 pathlib是跨平台的、面向对象的路径操作库, pathlib就是对os.path进行了封装,提供了一个便捷的,面向对象的操作方式, 相对os.path作为string对象需要进行众多繁琐的操作, 它才真正是for humans pyth
用户2196567
2018/07/02
9810
一分钟学一个 Python 标准库之 Pathlib
相对于 os.path 来说,Pathlib 极大地简化了路径相关的操作。举个例子来说:
爬虫技术学习
2023/03/06
4440
一分钟学一个 Python 标准库之 Pathlib
python小工具
http://blog.csdn.net/pipisorry/article/details/46754515
用户7886150
2020/12/30
6440
UNIX 高级环境编程 实验二 目录树的遍历
以课本132-134页程序4-22为参考,在此基础上进行修改和扩展,实现目录树的遍历,具体需要根据传入参数的不同实现以下功能:
glm233
2020/10/28
1.2K0
UNIX 高级环境编程 实验二  目录树的遍历
PHP读取目录树的实现方法分析
当时一看就懵逼了!基本的思路还是有的,不过是使用递归算法,但对PHP操作目录文件的方法却不是很了解,所以今天好好补习一下!
用户8824291
2021/07/13
7750
使用tree生成目录树结构
有时候,当你完成一个项目后,想要展示这个项目的目录结构(如下图所示),对该项目进行文档描述性说明,用于解释其项目中各个目录以及文件代表的含义,这样便于自己和后来的同学理解
itclanCoder
2020/10/28
3.6K0
使用tree生成目录树结构
[PYTHON] 核心编程笔记之九-Py
内建函数open()[以及file()]提供了初始化输入/输出(I/0)操作的通用接口,open()内建函数成功打开文件后会返回一个文件对象,否则引发一个错误,当操作失败,Python会产生一个IOError异常
py3study
2020/01/07
7730
附实战代码|告别OS模块,体验Python文件操作新姿势!
相比常用的 os.path而言,pathlib 对于目录路径的操作更简介也更贴近 Pythonic。但是它不单纯是为了简化操作,还有更大的用途。
刘早起
2020/11/23
6720
附实战代码|告别OS模块,体验Python文件操作新姿势!
python 文件操作新姿势 pathlib模块的详细使用
相比常用的 os.path而言,pathlib 对于目录路径的操作更简介也更贴近 Pythonic。但是它不单纯是为了简化操作,还有更大的用途。 pathlib 是Python内置库,Python 文档给它的定义是:The pathlib module – object-oriented filesystem paths(面向对象的文件系统路径)。pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统。
叶庭云
2022/05/09
7840
python 文件操作新姿势   pathlib模块的详细使用
树莓派3B+ 人脸识别(OpenCV)
首先,所有的方法都有类似的过积,即都使用了分好类的训练数据集(人脸数据库,每 个人都有很多样本)来进行“训练”,对图像或视频中检测到的人脸进行分析,并从两方面来确定:是否识别到目标,目标真正被识别到的置信度的度量,这也称为置信度评分。
全栈程序员站长
2022/09/12
1.1K0
树莓派3B+ 人脸识别(OpenCV)
【Python】生成某个文件夹的目录树
一些情况下我们想要生成某个工程文件夹的文件目录,写在文档里面逐一说明每个文件的功能,这是如果能自动生成文件树就是一件很方便的事。
杨丝儿
2022/04/11
1.5K0
python3基础:目录操作
os模块提供了统一的操作系统接口函数,python中对文件和文件夹的操作都要涉及到os和shutil模块,在使用前需要使用import引入,例如;
py3study
2020/01/09
1.4K0
Python - 超好用的第三方库pathlib,快速获取项目中各种路径
之前曾介绍过Python的os库详细使用方式,具体可看看这篇博文:https://www.cnblogs.com/poloyy/p/12341231.html
小菠萝测试笔记
2020/06/09
1.2K0
Python - 超好用的第三方库pathlib,快速获取项目中各种路径
用pathlib进行Python中的文件路径处理
本文介绍Python中的文件路径处理方法,从字符串连接、os.path.join()到Python3中处理文件路径的简单方法:pathlib。
MeteoAI
2019/07/24
4.4K0
相关推荐
求求你,别用 os.path 了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档