如何实现类似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")
代码说明
- 排序条目:用
sorted()对目录/文件排序,保证输出和tree命令的顺序一致 - 分支符号控制:通过
is_last判断当前条目是否是最后一个,分别输出└──(最后一个)和├──(中间条目) - 前缀更新:递归进入子目录时,根据当前条目是否是最后一个,更新前缀字符串——最后一个条目后面的前缀用空格,否则用竖线,这样能保持树形的连贯
- 数量统计:递归返回子目录的统计数,最终汇总输出总目录和文件数
效果演示
针对你给出的示例目录结构,运行代码后会输出:
├── 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
相关产品推荐
相关产品推荐

