如何将目录结构转换为含文件列表的嵌套字典并导出为JSON
给目录结构JSON添加文件列表的修改方案
你当前的代码仅构建了目录的嵌套字典,但未将每个目录对应的文件列表存入节点。下面提供两种合法的JSON结构方案及对应代码:
方案1:清晰分离文件与子目录(推荐)
将每个目录节点设计为包含files(文件列表)和directories(子目录字典)的结构,格式规范易读:
import os import json def fs_tree(root_dir): results = {} for dirpath, dirnames, filenames in os.walk(root_dir): # 拆分出从根目录开始的路径层级 parts = dirpath.split(os.sep) idx = parts.index(root_dir) path_parts = parts[idx:] # 定位到当前目录的父节点的子目录区 curr = results for part in path_parts[:-1]: curr = curr.setdefault(part, {"files": [], "directories": {}})["directories"] # 创建/更新当前目录的节点,存入文件列表 current_dir = path_parts[-1] if current_dir not in curr: curr[current_dir] = {"files": filenames, "directories": {}} else: curr[current_dir]["files"] = filenames return results # 示例调用与JSON导出 dir_path = "./level_0" # 替换为你的根目录路径 tree = fs_tree(dir_path) with open("directory_tree.json", "w", encoding="utf-8") as f: json.dump(tree, f, indent=2, ensure_ascii=False)
输出示例
{ "level_0": { "files": ["readme.md", "config.ini"], "directories": { "level_1a": { "files": ["data.csv"], "directories": {} }, "level_1e": { "files": ["note.txt"], "directories": { "level_2a": { "files": ["image.png"], "directories": {} } } } } } }
方案2:贴近你期望的紧凑结构
将文件列表作为目录节点的一个键(用_files避免与子目录名冲突),子目录作为同级键存在:
import os import json def fs_tree(root_dir): results = {} for dirpath, dirnames, filenames in os.walk(root_dir): parts = dirpath.split(os.sep) idx = parts.index(root_dir) path_parts = parts[idx:] # 定位到当前目录的父节点 curr = results for part in path_parts[:-1]: curr = curr.setdefault(part, {}) # 给当前目录节点添加文件列表 current_node = curr.setdefault(path_parts[-1], {}) current_node["_files"] = filenames return results # 调用与导出 dir_path = "./level_0" tree = fs_tree(dir_path) with open("directory_tree.json", "w", encoding="utf-8") as f: json.dump(tree, f, indent=2, ensure_ascii=False)
输出示例
{ "level_0": { "_files": ["readme.md", "config.ini"], "level_1a": { "_files": ["data.csv"] }, "level_1e": { "_files": ["note.txt"], "level_2a": { "_files": ["image.png"] } } } }
内容的提问来源于stack exchange,提问作者Spatial Digger
相关产品推荐
相关产品推荐

