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

如何将类JSON树形结构的TXT文件转换为Python字典并生成JSON?

解决缩进式类字典文本转Python字典及JSON的问题

你的核心问题是丢失了缩进层级信息,并且递归逻辑没有正确跟踪当前的嵌套字典。下面是可行的解决方案:

完整代码实现

import json

def parse_indented_text(file_path):
    root = {}
    # 栈结构:每个元素是(缩进深度, 当前字典)
    stack = [(-1, root)]
    
    with open(file_path, 'r') as f:
        for line in f:
            line = line.rstrip('\n')  # 只去掉换行符,保留缩进
            if not line.strip():  # 跳过空行
                continue
            
            # 计算当前行的缩进深度(用空格数量,假设缩进是空格)
            indent_depth = len(line) - len(line.lstrip())
            # 分割键和值
            parts = line.split(':', 1)
            key = parts[0].strip().rstrip(':')  # 去掉键末尾的冒号和前后空格
            value = parts[1].strip() if len(parts) > 1 else ''
            
            # 调整栈到当前缩进层级的父节点
            while stack[-1][0] >= indent_depth:
                stack.pop()
            
            current_parent = stack[-1][1]
            if not value:
                # 这是一个嵌套字典的键,创建新字典
                new_dict = {}
                current_parent[key] = new_dict
                stack.append((indent_depth, new_dict))
            else:
                # 这是普通键值对
                current_parent[key] = value
    
    return root

# 使用示例
data_dict = parse_indented_text('your_file.txt')
print(data_dict)

# 转换为JSON
with open('output.json', 'w') as f:
    json.dump(data_dict, f, indent=4)

关键步骤解释

  1. 保留缩进信息:没有直接用strip()处理整行,而是计算每行的缩进深度,这是判断嵌套层级的核心依据。
  2. 栈结构跟踪层级:用栈来维护当前的父字典,避免递归带来的全局变量和索引管理问题。每次遇到更深的缩进,就把新的子字典压入栈;缩进变浅时,弹出栈顶直到找到正确的父节点。
  3. 正确处理键值:分割后去掉键末尾的冒号,处理值的空白;如果值为空,说明这是一个嵌套字典的入口,创建新字典并加入父字典,同时更新栈。

对你之前代码的问题分析

  • 丢失缩进:line.strip()直接去掉了所有前后空白,导致无法判断层级关系,这是最致命的错误。
  • 全局字典问题:递归中使用全局的data_dict,会导致所有层级的键值都被放到同一个字典里,无法形成嵌套。
  • 键的处理错误:没有去掉键末尾的冒号,最终字典的键会是outer:而不是outer。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:45:41