如何将类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)
关键步骤解释
- 保留缩进信息:没有直接用
strip()处理整行,而是计算每行的缩进深度,这是判断嵌套层级的核心依据。 - 栈结构跟踪层级:用栈来维护当前的父字典,避免递归带来的全局变量和索引管理问题。每次遇到更深的缩进,就把新的子字典压入栈;缩进变浅时,弹出栈顶直到找到正确的父节点。
- 正确处理键值:分割后去掉键末尾的冒号,处理值的空白;如果值为空,说明这是一个嵌套字典的入口,创建新字典并加入父字典,同时更新栈。
对你之前代码的问题分析
- 丢失缩进:
line.strip()直接去掉了所有前后空白,导致无法判断层级关系,这是最致命的错误。 - 全局字典问题:递归中使用全局的
data_dict,会导致所有层级的键值都被放到同一个字典里,无法形成嵌套。 - 键的处理错误:没有去掉键末尾的冒号,最终字典的键会是
outer:而不是outer。
内容的提问来源于stack exchange,提问作者Issay Shields
相关产品推荐
相关产品推荐

