如何用Python从JSON目录结构重建文件完整路径?
用Python重建未知深度目录结构的文件完整路径
给定映射目录结构的JSON数据如下:
{ "/": { "home": { "usr": { "Documents": { "Scripts": { "hse": { "2023-04-13 12:54:55.169974.log": {"hash": "123zyx"}, "hse3.py": null, "hse2.py": null, "hse.py": null, "Resources": { "Ideas.odt": null, "15 research-based questions.odt": null, "Archive": { "Solutions.odt": null }}}}}}}}}
由于目录深度不确定,我们可以通过递归遍历或者**迭代遍历(栈实现)**的方式,逐个节点解析,拼接出每个文件的完整路径。
方法一:递归遍历
递归思路直观:从根目录出发,遍历当前目录下的所有子节点,若子节点是目录(值为字典),则带着当前路径递归进入该目录;若为文件(值为null或含hash的字典),则拼接完整路径并记录。
def extract_file_paths(data, current_path="", paths=None): if paths is None: paths = [] # 遍历当前节点的键值对 for name, value in data.items(): # 拼接路径:根目录直接用键名,后续用"/"连接 full_path = f"{current_path}/{name}" if current_path else name if isinstance(value, dict): # 是目录,递归深入 extract_file_paths(value, full_path, paths) else: # 是文件,添加到路径列表 paths.append(full_path) return paths # 加载JSON数据为字典(实际场景可通过json.load()读取文件) json_data = { "/": { "home": { "usr": { "Documents": { "Scripts": { "hse": { "2023-04-13 12:54:55.169974.log": {"hash": "123zyx"}, "hse3.py": None, "hse2.py": None, "hse.py": None, "Resources": { "Ideas.odt": None, "15 research-based questions.odt": None, "Archive": { "Solutions.odt": None }}}}}}}}} # 提取并打印所有文件路径 file_paths = extract_file_paths(json_data) for path in file_paths: print(path)
运行后输出:
/home/usr/Documents/Scripts/hse/2023-04-13 12:54:55.169974.log /home/usr/Documents/Scripts/hse/hse3.py /home/usr/Documents/Scripts/hse/hse2.py /home/usr/Documents/Scripts/hse/hse.py /home/usr/Documents/Scripts/hse/Resources/Ideas.odt /home/usr/Documents/Scripts/hse/Resources/15 research-based questions.odt /home/usr/Documents/Scripts/hse/Resources/Archive/Solutions.odt
方法二:迭代遍历(栈实现)
若目录深度极大,递归可能触发栈溢出,这时用迭代方式更安全。用栈保存待遍历的目录节点和当前路径,逐个弹出处理:
def extract_file_paths_iterative(data): paths = [] # 栈元素格式:(当前目录字典, 当前路径) stack = [(data, "")] while stack: current_dir, current_path = stack.pop() for name, value in current_dir.items(): full_path = f"{current_path}/{name}" if current_path else name if isinstance(value, dict): # 是目录,压入栈后续处理 stack.append((value, full_path)) else: # 是文件,记录路径 paths.append(full_path) # 栈是后进先出,反转后和递归结果顺序一致 paths.reverse() return paths # 使用示例 file_paths = extract_file_paths_iterative(json_data) for path in file_paths: print(path)
这段代码输出和递归方法完全一致。
关键逻辑说明
- 路径拼接:根目录直接用键名
"/",后续子目录/文件用"/"连接,保证路径格式统一。 - 节点判断:通过
isinstance(value, dict)区分目录和文件——值为字典则是子目录,否则为文件。 - 结果收集:所有文件路径会被存入列表,方便后续批量操作(如保存到文件、批量校验等)。
内容的提问来源于stack exchange,提问作者Hal
相关产品推荐
相关产品推荐

