基于Python实现优雅的目录结构打印工具

 更新时间:2025年07月07日 08:33:37   作者:叹一曲当时只道是寻常  
在软件开发,系统管理和日常工作中,我们经常需要查看和分析目录结构,本文我们将使用Python语言打造一个目录结构打印工具,有需要的小伙伴可以了解下

在软件开发、系统管理和日常工作中,我们经常需要查看和分析目录结构。

工具功能概述

这个DirectoryPrinter类提供了以下功能:

  • 递归打印目录结构
  • 可配置是否显示隐藏文件
  • 可设置最大递归深度
  • 自定义缩进和文件/文件夹符号
  • 友好的交互式配置界面

核心代码解析

初始化配置

def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None, 
             indent_symbol='│   ', folder_symbol='/ ', file_symbol='- '):
    self.root_dir = root_dir
    self.show_hidden = show_hidden
    self.max_depth = max_depth
    self.indent_symbol = indent_symbol
    self.folder_symbol = folder_symbol
    self.file_symbol = file_symbol
    self.depth = depth

构造函数接收多个参数,允许用户自定义打印行为。特别是indent_symbolfolder_symbolfile_symbol参数,可以完全改变输出样式。

目录打印逻辑

def print_directory(self):
    try:
        items = os.listdir(self.root_dir)
    except FileNotFoundError:
        print(f"指定的目录 {self.root_dir} 不存在")
        return
    except PermissionError:
        print(f"无法访问目录 {self.root_dir}")
        return
    
    # 过滤隐藏文件
    if not self.show_hidden:
        items = [item for item in items if not (item.startswith('.') and os.path.isfile(os.path.join(self.root_dir, item)))]

方法首先尝试列出目录内容,并处理可能出现的异常。然后根据配置过滤隐藏文件。

递归打印

for index, item in enumerate(sorted(items), start=1):
    path = os.path.join(self.root_dir, item)
    is_dir = os.path.isdir(path)
    
    # 构建前缀
    prefix = self.indent_symbol * self.depth
    if index == len(items):
        if is_dir:
            print(f"{prefix}└── {self.folder_symbol}{item}")
        else:
            print(f"{prefix}└── {self.file_symbol}{item}")
    else:
        if is_dir:
            print(f"{prefix}├── {self.folder_symbol}{item}")
        else:
            print(f"{prefix}├── {self.file_symbol}{item}")
    
    # 递归处理子目录
    if is_dir:
        child_printer = DirectoryPrinter(
            root_dir=path,
            show_hidden=self.show_hidden,
            depth=self.depth + 1,
            max_depth=self.max_depth,
            indent_symbol=self.indent_symbol,
            folder_symbol=self.folder_symbol,
            file_symbol=self.file_symbol
        )
        child_printer.print_directory()

这部分代码实现了递归打印的核心逻辑,使用不同的符号区分文件和文件夹,以及区分是否是最后一项。

使用示例

通过交互式界面配置打印参数:

def main():
    root_directory = input("请输入要打印的目录路径: ") or os.getcwd()
    hide_hidden_files = input("是否隐藏隐藏文件? (y/n): ").lower() != 'y'
    max_depth = input("请输入最大递归深度 (留空表示无限制): ").strip() or None
    auto_print = input("是否自动打印目录结构? (y/n): ").lower() == 'y'
    
    printer = DirectoryPrinter(
        root_dir=root_directory,
        show_hidden=hide_hidden_files,
        max_depth=max_depth
    )
    
    printer.print_directory()

输出效果

示例输出可能如下:

├── / dir1
│   ├── - file1.txt
│   └── / subdir
│       └── - file2.txt
└── / dir2
    ├── - file3.txt
    └── - file4.txt

完整代码

import os

class DirectoryPrinter:
    def __init__(self, root_dir, show_hidden=False, depth=0, max_depth=None, indent_symbol='│   ', folder_symbol='/ ', file_symbol='- '):
        """
        初始化目录打印器

        :param root_dir: 指定要打印的目录路径
        :param show_hidden: 是否打印隐藏文件和文件夹(默认为 False)
        :param depth: 当前递归深度(内部使用,用户无需设置)
        :param max_depth: 最大递归深度,None 表示无限制
        :param indent_symbol: 缩进符号
        :param folder_symbol: 文件夹前缀符号
        :param file_symbol: 文件前缀符号
        """
        self.root_dir = root_dir
        self.show_hidden = show_hidden
        self.max_depth = max_depth
        self.indent_symbol = indent_symbol
        self.folder_symbol = folder_symbol
        self.file_symbol = file_symbol
        self.depth = depth

    def print_directory(self):
        """
        打印目录结构
        """
        try:
            items = os.listdir(self.root_dir)
        except FileNotFoundError:
            print(f"指定的目录 {self.root_dir} 不存在")
            return
        except PermissionError:
            print(f"无法访问目录 {self.root_dir}")
            return

        # 过滤隐藏文件
        if not self.show_hidden:
            items = [item for item in items if not (item.startswith('.') and os.path.isfile(os.path.join(self.root_dir, item)))]

        # 递归打印目录和文件
        for index, item in enumerate(sorted(items), start=1):
            path = os.path.join(self.root_dir, item)
            is_dir = os.path.isdir(path)

            # 根据当前深度和最大深度决定是否继续递归
            if self.max_depth is not None and self.depth > self.max_depth:
                continue

            # 构建前缀
            prefix = self.indent_symbol * self.depth
            if index == len(items):
                if is_dir:
                    print(f"{prefix}└── {self.folder_symbol}{item}")
                else:
                    print(f"{prefix}└── {self.file_symbol}{item}")
            else:
                if is_dir:
                    print(f"{prefix}├── {self.folder_symbol}{item}")
                else:
                    print(f"{prefix}├── {self.file_symbol}{item}")

            # 递归处理子目录
            if is_dir:
                child_printer = DirectoryPrinter(
                    root_dir=path,
                    show_hidden=self.show_hidden,
                    depth=self.depth + 1,
                    max_depth=self.max_depth,
                    indent_symbol=self.indent_symbol,
                    folder_symbol=self.folder_symbol,
                    file_symbol=self.file_symbol
                )
                child_printer.print_directory()

def main():
    """
    主函数,用户配置入口
    """
    # 配置参数
    root_directory = input("请输入要打印的目录路径: ") or os.getcwd()  # 默认为当前目录
    hide_hidden_files = input("是否隐藏隐藏文件? (y/n): ").lower() != 'y'
    max_depth = input("请输入最大递归深度 (留空表示无限制): ").strip() or None  # 无限制
    auto_print = input("是否自动打印目录结构? (y/n): ").lower() == 'y'

    # 转换为整数
    try:
        max_depth = int(max_depth) if max_depth else None
    except ValueError:
        print("最大递归深度必须为整数")
        return

    # 打印配置
    print("\n=== 配置 ===")
    print(f"根目录: {root_directory}")
    print(f"隐藏文件和文件夹: {'是' if hide_hidden_files else '否'}")
    print(f"最大递归深度: {'无限制' if max_depth is None else max_depth}")

    # 初始化打印器
    printer = DirectoryPrinter(
        root_dir=root_directory,
        show_hidden=hide_hidden_files,
        max_depth=max_depth
    )

    # 开始打印
    if auto_print:
        print("\n=== 目录结构 ===")
        printer.print_directory()
    else:
        input("\n按下回车键开始打印目录结构...")
        print("\n=== 目录结构 ===")
        printer.print_directory()

# 程序主入口
if __name__ == "__main__":
    main()

到此这篇关于基于Python实现优雅的目录结构打印工具的文章就介绍到这了,更多相关Python打印目录结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python轻松写个课堂随机点名系统

    Python轻松写个课堂随机点名系统

    现在的学生大部分都很积极,会主动举手回答问题。但是,也会遇到一些不好的情况,比如年级越高主动举手的人越少,所以本文写了一个随机的学生点名系统可以帮老师解决这些问题
    2023-01-01
  • 在Django中使用MQTT的方法

    在Django中使用MQTT的方法

    这篇文章主要介绍了在Django中使用MQTT的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • python转换wrf输出的数据为网页可视化json格式

    python转换wrf输出的数据为网页可视化json格式

    这篇文章主要介绍了python转换wrf输出的数据为网页可视化json格式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • python判断字符串是否是json格式方法分享

    python判断字符串是否是json格式方法分享

    这篇文章主要介绍了python判断字符串是否是json格式方法分享,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Python实现计算信息熵的示例代码

    Python实现计算信息熵的示例代码

    信息熵(information entropy)是信息论的基本概念。描述信息源各可能事件发生的不确定性。本文将通过Python实现信息熵的计算,感兴趣的可以了解一下
    2022-12-12
  • python3.3使用tkinter开发猜数字游戏示例

    python3.3使用tkinter开发猜数字游戏示例

    这篇文章主要介绍了python3.3使用tkinter开发猜数字游戏示例,需要的朋友可以参考下
    2014-03-03
  • Python中切片操作的示例详解

    Python中切片操作的示例详解

    在刚学python时候,我们都知道字符串(String)、列表(list)和元组(tuple)序列化数据类型支持切片操作。本文我们将对熟悉的切片操作进行系统学习,感兴趣的可以了解一下
    2022-11-11
  • 基于Python开发一个有趣的工作时长计算器

    基于Python开发一个有趣的工作时长计算器

    随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可以了解下
    2025-06-06
  • python matplotlib绘图过程中设置线条颜色实战举例

    python matplotlib绘图过程中设置线条颜色实战举例

    Matplotlib是一个用于数据可视化和创建交互式图表的Python库,下面这篇文章主要给大家介绍了关于python matplotlib绘图过程中设置线条颜色的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Python从入门到精通之多线程使用详解

    Python从入门到精通之多线程使用详解

    这篇文章主要介绍了Python中的多线程使用,包括创建线程、线程同步、线程间通信以及线程池等基本概念和技巧,文中的示例代码讲解详细,需要的可以参考一下
    2023-07-07

最新评论