Python如何从文件路径列表生成表示目录树的嵌套字典结构
不需要递归,用迭代方式即可高效实现,6000条路径处理无压力。
实现思路
- 初始化空字典作为整个目录树的根节点
- 遍历每条路径,按
/分割为层级片段,过滤掉空字符串(避免路径首尾/、末尾/产生无效空层级) - 用临时指针逐层遍历字典:当前层级不存在对应目录名时,新建空字典作为值,指针进入下一级
- 处理到最后一个层级片段时,可根据需求判断是文件还是目录,对应赋值即可
代码实现(Python)
def build_dir_tree(path_list): root = {} for path in path_list: # 分割路径并过滤无效空片段 parts = [p for p in path.split('/') if p] current_level = root # 处理前n-1层(均为目录) for part in parts[:-1]: if part not in current_level: current_level[part] = {} current_level = current_level[part] # 处理最后一层,可根据规则区分文件/目录 last_part = parts[-1] # 示例规则:带后缀的判定为文件,否则判定为目录 if '.' in last_part: current_level[last_part] = "file" else: if last_part not in current_level: current_level[last_part] = {} return root # 测试用例(你的示例路径) path_list = [ "study/patient/visitNumber/C1/", "study/patient/visitNumber/C1/subject_14Jan16_V17_C1a.mp4", "study/patient/visitNumber/C1/subject_14Jan16_V17_C1b.mp4", "study/patient/visitNumber/C2/", "study/patient/visitNumber/C2/subject_14Jan16_V17_C2a.mp4", "study/patient/visitNumber/C2/study_subject_V17_C2.mp4", "study/patient/visitNumber/master/C1/subject_14Jan16_V17_C1a.MTS", ] # 生成目录树 dir_tree = build_dir_tree(path_list) # 格式化打印结果 import json print(json.dumps(dir_tree, indent=2, ensure_ascii=False))
输出示例
{ "study": { "patient": { "visitNumber": { "C1": { "subject_14Jan16_V17_C1a.mp4": "file", "subject_14Jan16_V17_C1b.mp4": "file" }, "C2": { "subject_14Jan16_V17_C2a.mp4": "file", "study_subject_V17_C2.mp4": "file" }, "master": { "C1": { "subject_14Jan16_V17_C1a.MTS": "file" } } } } } }
如果不需要区分文件和目录的存储格式,直接删除最后一层的判断逻辑,统一按目录创建空字典即可。
内容的提问来源于stack exchange,提问作者imjellybaby
相关产品推荐
相关产品推荐

