Python处理IRIS文件报JSONDecodeError,如何提取指定字段导出CSV
问题诊断
你遇到的问题主要分为两类,对应解决方案如下:
JSONDecodeError报错原因:你提供的示例JSON末尾缺少]}类的闭合符号,还存在末尾多余逗号的问题,这类半结构化导出的.iris文件大多存在JSON格式不规范的问题,直接用标准json库解析会失败- 原有代码的问题:
- 缩进错误:csv写入的上下文管理器提前结束,循环里调用writer时文件已经关闭,会触发IO错误
- 仅能提取顶层字典的键,遇到嵌套字典里的同名字段没有处理逻辑,无法满足提取需求
修复后的实现代码
import csv import json from pathlib import Path # 目标提取键 TARGET_KEYS = ("streamType", "uid", "enabled", "login", "name") def parse_incomplete_json(file_content): """处理不规范的JSON内容,修复常见格式错误""" # 去除末尾空白和多余逗号 content = file_content.strip().rstrip(',') # 自动补全缺失的闭合括号,直到JSON可以正常解析 while True: try: return json.loads(content) except json.JSONDecodeError as e: if "Expecting '}" in e.msg or "Expecting value" in e.msg: content += '}' elif "Expecting ']" in e.msg: content += ']' else: # 其他格式错误抛出,由外层异常捕获处理 raise def extract_top_target_keys(data, target_keys): """优先提取顶层的目标键,不会被嵌套内的同名字段覆盖""" res = {} for k in target_keys: if k in data: res[k] = data[k] # 若需要提取所有层级的同名字段,可将此处修改为递归遍历逻辑 return res if __name__ == "__main__": # 替换为你的.iris文件所在的文件夹路径 path = Path(r"替换为你的文件目录路径") with open(path / "result.csv", "w", newline="", encoding="utf-8-sig") as out_f: writer = csv.DictWriter(out_f, fieldnames=TARGET_KEYS, extrasaction='ignore') writer.writeheader() # 遍历所有.iris文件 for file in path.glob("*.iris"): try: with open(file, encoding="utf-8") as inp_f: file_content = inp_f.read() data = parse_incomplete_json(file_content) row = extract_top_target_keys(data, TARGET_KEYS) writer.writerow(row) print(f"文件{file.name}处理完成") except Exception as e: print(f"文件{file.name}处理失败,错误信息:{str(e)}") continue
功能说明
- 格式容错:针对不规范JSON做了预处理和自动补全逻辑,同时增加异常捕获,单个文件解析失败不会中断整个批量处理任务
- 字段提取规则:默认优先提取顶层的目标字段,不会被global、grants等嵌套结构里的同名字段覆盖,可根据需求调整提取逻辑
- 编码兼容:指定utf-8编码读写文件,避免中文乱码问题
内容的提问来源于stack exchange,提问作者Phanikumar
相关产品推荐
相关产品推荐

