首页Python【Python小程序】以树...

【Python小程序】以树状图的形式显示目录结构

本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1i9F6oV1J5oZnIsOASDs0gQ?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_mini_program





01

脚本需求


以树状图的形式显示指定路径下的目录结构。
---test_dir
    |   doc_1.doc
    |   
    +---sub_dir_1
    |   |   docx_3.docx
    |   |   png_3.png
    |   |   
    |   +---sub_dir_11
    |   |       gif_3.gif
    |   |       jpg_2.jpg
    |   |       
    |   ---sub_dir_12
    |           md_4.md
    |           ppt_2.ppt
    |           
    ---sub_dir_2
        |   doc_2.doc
        |   pptx_3.pptx
        |   
        ---sub_dir_21
                jpg_3.jpg
                ppt_3.ppt
要实现上述方式可以直接使用Windows 操作系统中命令提示符(CMD)工具中的内置tree 命令。也可以自己编写一段Python代码实现上述功能。
02

使用CMD


在 Windows 操作系统中,tree 命令是一个内置的命令提示符(CMD)工具,用于以树状结构显示目录的内容。这可以帮助我们直观地了解文件和文件夹的层次结构。
使用 tree命令的基本方法如下:
  • 打开命令提示符(CMD):
按 Win + R 键,输入 cmd,然后按 Enter。或者在“开始”菜单中搜索“cmd”或“命令提示符”,然后点击打开。
  • 使用 tree 命令:
 tree 命令基本语法:
TREE [drive:][path] [/F] [/A]
其中:
  • [drive:][path]
可选参数,用来指定要显示树状图的目录路径。如果不指定,tree 命令默认显示当前目录的树状图。
drive: 指定驱动器,例如 C:
path : 指定路径,例如 UsersPublic 或 C:Windows
  • /F
可选参数,用于在每个目录中显示文件名。使用该参数时,tree 命令将列出指定目录下的所有文件和子目录,以树状结构展示,并在每个文件夹下显示其包含的文件名。不适用该参数时,
  • /A
可选参数,用于使用ASCII字符而不是扩展字符来显示链接子目录的线条。
最后,还可以通过重定向操作符 > 将输出保存到文本文件。例如,如果想要保存当前目录的树状图到名为 directory_tree.txt 的文件中,可以使用以下命令:
tree > directory_tree.txt
另外,需要注意的是,在 Jupyter Notebook 中,如果想要执行系统命令(如 tree),需要在命令前加上感叹号 ! 来告诉 Jupyter Notebook 执行一个 shell 命令。这是因为 Jupyter Notebook 默认情况下是用于执行 Python 代码的,而 ! 允许执行 shell 命令。
03

Python代码


本次给出两种实现目录结构打印的代码方式。
  • 方法一:
该脚本通过定义一个print_directory_tree函数,用于递归地打印指定目录及其子目录的树状结构,并可选择的保存到txt文件中。
# 导入os模块,用于操作文件和目录
import os

def print_directory_tree(path, prefix='', is_root=False, output_file=None):
    """
    定义函数,用于打印目录树
    
    参数:
    - path: 要打印的目录路径
    - prefix: 前缀字符串,用于表示当前层级的缩进
    - is_root: 标记是否为根目录,用于控制输出格式
    - output_file: 文件对象,用于写入目录树输出(如果为None,则打印到控制台)
    "
""
    # 如果是根目录,打印根目录名称
    if is_root:
        directory_name = os.path.basename(path)
        print(f"{prefix}{directory_name}/")
        if output_file is not None:
            output_file.write(f"{prefix}{directory_name}/n")
        
    # 获取path目录下的所有文件和子目录
    items = os.listdir(path)
    # 遍历目录下的所有项
    for item in items:
        # 获取当前项的完整路径
        item_path = os.path.join(path, item)
        # 如果当前项是一个文件
        if os.path.isfile(item_path):
            # 打印文件名,使用├──表示是分支
            print(f"{prefix}├── {item}")
            if output_file is not None:
                output_file.write(f"{prefix}├── {item}n")
        # 如果当前项是一个目录
        elif os.path.isdir(item_path):
            # 打印目录名,使用└──表示是分支
            print(f"{prefix}└── {item}/")
            if output_file is not None:
                output_file.write(f"{prefix}└── {item}/n")
            # 递归调用函数,打印子目录的树
            print_directory_tree(item_path, prefix + "    ", False, output_file)

# 输入要打印的文件夹路径
folder_path = './test_dir'
# 然后保存到txt文件中
with open('directory_tree_2.txt''w', encoding='utf-8') as f:
    print_directory_tree(folder_path, is_root=True, output_file=f)

  • 代码二:
该脚本通过定义一个print_directory_tree函数,根据当前目录与根目录之间的路径深度,打印指定目录及其子目录的树状结构:
import os

def print_directory_tree(path, prefix=''):
    """
    打印指定路径下的目录树。
    
    参数:
    - path: 要打印的目录路径。
    - prefix: 前缀字符串,用于控制输出格式(本例中未使用,但保留参数以备扩展)。
    "
""
    # 使用os.walk遍历目录树,它返回一个三元组
    for root, dirs, files in os.walk(path):
        # 计算当前目录与根目录之间的路径深度
        level = root.replace(path, '').count(os.sep)
        # 根据深度计算缩进空格数,每层缩进4个空格
        indent = ' ' * level

        # 如果不是根目录,则添加垂直线前缀和缩进
        if level > 0:
            # 打印当前目录名,使用└──表示当前分支的结束
            print(f'{''}{indent}└──{os.path.basename(root)}/')
        # 如果是根目录,则不添加垂直线前缀
        else:
            # 打印根目录名,不使用└──
            print(f'{''}{indent}{os.path.basename(root)}/')
        
        # 遍历当前目录下的所有文件
        for f in files:
            # 打印文件名,使用├──表示分支
            # '    ' * level用于创建与目录名对齐的空格
            print(f'{''}{indent}{'    ' * level}├──{f}')

# 设置要打印的目录路径
directory = './test_dir'
# 调用函数,开始打印目录树
print_directory_tree(directory)

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments