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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:52:31