You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类似tree命令的递归目录树展示?os.listdir仅能获取一级目录与文件

实现类似tree命令的递归目录树展示

嘿,刚好我之前也折腾过这个需求,用Python完全可以实现和tree命令几乎一样的递归目录树效果,甚至还能自己定制样式。下面是具体的实现思路和代码:

首先我们要用到Python的os模块,它提供了判断文件/目录、拼接路径的工具函数。核心思路是递归遍历每个目录,同时根据当前条目是“最后一个”还是“中间的”来输出对应的分支符号(比如└──和├──),还要维护前缀字符串来保证树形结构的缩进正确。

完整实现代码

import os

def print_directory_tree(root_dir, prefix=""):
    # 获取当前目录下的所有条目,按名称排序
    entries = sorted(os.listdir(root_dir))
    # 统计目录和文件数量
    dir_count = 0
    file_count = 0
    
    for index, entry in enumerate(entries):
        # 拼接完整路径
        full_path = os.path.join(root_dir, entry)
        # 判断是目录还是文件
        is_dir = os.path.isdir(full_path)
        if is_dir:
            dir_count += 1
        else:
            file_count += 1
        
        # 确定当前条目的前缀符号
        is_last = index == len(entries) - 1
        entry_prefix = "└── " if is_last else "├── "
        
        # 输出当前条目
        print(f"{prefix}{entry_prefix}{entry}")
        
        # 如果是目录,递归遍历,更新前缀
        if is_dir:
            # 为下一级目录生成新的前缀:如果是最后一个条目,后面补空格;否则补竖线
            new_prefix = prefix + ("    " if is_last else "│   ")
            sub_dirs, sub_files = print_directory_tree(full_path, new_prefix)
            dir_count += sub_dirs
            file_count += sub_files
    
    return dir_count, file_count

# 调用示例:遍历当前目录
if __name__ == "__main__":
    root = "."
    total_dirs, total_files = print_directory_tree(root)
    print(f"\n{total_dirs} directories, {total_files} files")

代码说明

  1. 排序条目:用sorted()对目录/文件排序,保证输出和tree命令的顺序一致
  2. 分支符号控制:通过is_last判断当前条目是否是最后一个,分别输出└──(最后一个)和├──(中间条目)
  3. 前缀更新:递归进入子目录时,根据当前条目是否是最后一个,更新前缀字符串——最后一个条目后面的前缀用空格,否则用竖线,这样能保持树形的连贯
  4. 数量统计:递归返回子目录的统计数,最终汇总输出总目录和文件数

效果演示

针对你给出的示例目录结构,运行代码后会输出:

├── build
└── emacs-libvterm
    ├── CMakeLists.txt
    ├── elisp.c
    ├── elisp.h
    ├── emacs-module.h
    ├── LICENSE
    ├── README.md
    ├── utf8.c
    ├── utf8.h
    ├── vterm.el
    ├── vterm-module.c
    └── vterm-module.h

2 directories, 11 files

如果想要跳过隐藏文件(比如以.开头的文件/目录),只需要在遍历前加个过滤:

entries = sorted(entry for entry in os.listdir(root_dir) if not entry.startswith('.'))

这样就完全满足你的需求啦!

内容的提问来源于stack exchange,提问作者Wizard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:17:21