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

Python根据文件路径列表生成带分支可视化目录树的方法

基于文件路径列表生成带分支符号的目录树

本场景为实体目录扫描打印树结构的扩展,核心要求为输入文件路径列表,递归生成带标准分支符号、层级清晰的目录树字符串,支持任意深度的目录结构,无需读取本地实体目录。

效果参考

输入

[
    'main_folder\\file01.txt',
    'main_folder\\file02.txt',
    'main_folder\\folder_sub1\\file03.txt',
    'main_folder\\folder_sub1\\file04.txt',
    'main_folder\\folder_sub1\\file05.txt',
    'main_folder\\folder_sub1\\folder_sub1-1\\file06.txt',
    'main_folder\\folder_sub1\\folder_sub1-1\\file07.txt',
    'main_folder\\folder_sub1\\folder_sub1-1\\file08.txt',
    'main_folder\\folder_sub2\\file09.txt',
    'main_folder\\folder_sub2\\file10.txt',
    'main_folder\\folder_sub2\\file11.txt'
]

输出

main_folder
├── file01.txt
├── file02.txt
├── folder_sub1
│   ├── file03.txt
│   ├── file04.txt
│   ├── file05.txt
│   └── folder_sub1-1
│       ├── file06.txt
│       ├── file07.txt
│       └── file08.txt
└── folder_sub2
    ├── file09.txt
    ├── file10.txt
    └── file11.txt

如果需要省略最外层根目录,直接渲染根节点下的子内容即可,输出和需求示例完全匹配。

实现方案

实现分为两个核心步骤:

  • 路径转嵌套字典:遍历所有输入路径,按路径分段逐层构建嵌套字典,自动适配Windows、Unix系统的路径分隔符
  • 递归渲染树结构:遍历嵌套字典,根据节点是否为当前层级最后一项,动态选择分支连接符、拼接子层级前缀,最终生成对齐无错位的树状字符串

完整代码

from pathlib import PurePosixPath, PureWindowsPath
import os

def paths_to_nested_dict(paths: list[str]) -> dict:
    """将文件路径列表转换为代表目录结构的嵌套字典"""
    tree = {}
    for path in paths:
        # 自动适配不同系统的路径分隔符
        if os.sep == "\\":
            path_parts = PureWindowsPath(path).parts
        else:
            path_parts = PurePosixPath(path).parts
        current_node = tree
        for part in path_parts:
            current_node = current_node.setdefault(part, {})
    return tree

def render_directory_tree(tree: dict, prefix: str = "") -> list[str]:
    """递归渲染嵌套目录字典为带分支符号的行列表"""
    lines = []
    items = list(tree.items())
    for index, (node_name, child_nodes) in enumerate(items):
        is_last_node = index == len(items) - 1
        # 选择当前节点的连接符
        connector = "└── " if is_last_node else "├── "
        lines.append(f"{prefix}{connector}{node_name}")
        # 存在子目录则递归渲染,更新子层级前缀
        if child_nodes:
            child_prefix = "    " if is_last_node else "│   "
            lines.extend(render_directory_tree(child_nodes, prefix + child_prefix))
    return lines

# 调用示例
if __name__ == "__main__":
    input_path_list = [
        'main_folder\\file01.txt',
        'main_folder\\file02.txt',
        'main_folder\\folder_sub1\\file03.txt',
        'main_folder\\folder_sub1\\file04.txt',
        'main_folder\\folder_sub1\\file05.txt',
        'main_folder\\folder_sub1\\folder_sub1-1\\file06.txt',
        'main_folder\\folder_sub1\\folder_sub1-1\\file07.txt',
        'main_folder\\folder_sub1\\folder_sub1-1\\file08.txt',
        'main_folder\\folder_sub2\\file09.txt',
        'main_folder\\folder_sub2\\file10.txt',
        'main_folder\\folder_sub2\\file11.txt'
    ]
    # 转换为嵌套字典
    dir_tree = paths_to_nested_dict(input_path_list)
    # 提取根节点
    root_name, root_content = next(iter(dir_tree.items()))
    # 带根节点输出
    output_lines = [root_name] + render_directory_tree(root_content)
    print("\n".join(output_lines))

    # 不带根节点(匹配需求示例输出)
    # output_lines = render_directory_tree(root_content)
    # print("\n".join(output_lines))

特性说明

  • 无第三方依赖,仅使用Python标准库
  • 递归逻辑无深度限制,支持任意层级的目录结构
  • 分支对齐逻辑和系统原生tree命令输出完全一致,无错位问题
  • 自动适配不同操作系统的路径格式,Windows反斜杠、Linux/macOS正斜杠路径均可正常解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:30:45