Python实现指定格式JSON数据提取转换后写入TXT文件
特定结构标注JSON转指定格式TXT的Python实现方案
核心处理逻辑如下:
- 读取目标JSON文件,按字段解析内容
- 遍历
sentences字典的每一项,字典键为原句文本,值为对应实体标注列表 - 对每个实体,直接用给定的
start、end字符下标从原句截取实体文本,避免字符串匹配带来的误差 - 按「原句, 标签1: 实体1, 标签2: 实体2...」的格式拼接每行内容
- 逐行写入输出TXT文件,可选保留文档名、链接、分块号元信息方便溯源
参考输入结构示例
// demo.json 示例文件 { "doc": "产品说明手册v1.0", "url": "内部文档访问地址", "chunk": 3, "sentences": { "阿里云云服务器ECS支持按量付费模式": [ {"start": 0, "end": 9, "label": "云产品"}, {"start": 11, "end": 15, "label": "计费模式"} ], "对象存储OSS提供标准、低频、归档三种存储类型": [ {"start": 0, "end": 5, "label": "云产品"}, {"start": 8, "end": 10, "label": "存储类型"}, {"start": 11, "end": 13, "label": "存储类型"}, {"start": 14, "end": 16, "label": "存储类型"} ] } }
可直接运行的实现代码
import json from typing import Dict, List def process_annotation_json(input_json_path: str, output_txt_path: str, add_meta: bool = True): """ 处理标注JSON文件,输出指定格式TXT :param input_json_path: 输入JSON文件本地路径 :param output_txt_path: 输出TXT文件本地路径 :param add_meta: 是否在文件开头写入文档名、链接、分块号元信息 """ # 读取JSON文件,指定utf-8编码避免中文乱码 with open(input_json_path, 'r', encoding='utf-8') as f: data = json.load(f) # 提取公共字段 doc_name = data.get("doc", "") doc_url = data.get("url", "") chunk_id = data.get("chunk", "") sentences: Dict[str, List[Dict]] = data.get("sentences", {}) output_lines = [] # 按需写入元信息 if add_meta: output_lines.append(f"文档名: {doc_name}") output_lines.append(f"文档链接: {doc_url}") output_lines.append(f"分块编号: {chunk_id}") output_lines.append("-"*50) # 遍历每个句子做格式转换 for sentence_text, entities in sentences.items(): line_parts = [sentence_text] for ent in entities: start = ent.get("start", 0) end = ent.get("end", 0) label = ent.get("label", "未知标签") # 做边界校验避免下标越界报错,Python字符串切片为左闭右开,适配绝大多数标注工具的下标规则 if 0 <= start < end <= len(sentence_text): ent_text = sentence_text[start:end] line_parts.append(f"{label}: {ent_text}") output_lines.append(", ".join(line_parts)) # 写入结果到TXT with open(output_txt_path, 'w', encoding='utf-8') as f: f.write("\n".join(output_lines)) # 调用示例 if __name__ == "__main__": process_annotation_json( input_json_path="demo.json", output_txt_path="annotation_result.txt", add_meta=True )
输出效果参考
上述示例代码运行后,生成的TXT内容如下:
文档名: 产品说明手册v1.0 文档链接: 内部文档访问地址 分块编号: 3 -------------------------------------------------- 阿里云云服务器ECS支持按量付费模式, 云产品: 阿里云云服务器ECS, 计费模式: 按量付费 对象存储OSS提供标准、低频、归档三种存储类型, 云产品: 对象存储OSS, 存储类型: 标准, 存储类型: 低频, 存储类型: 归档
适配调整说明
- 如果你使用的标注工具下标从1开始计数,截取实体时把
sentence_text[start:end]改为sentence_text[start-1:end-1]即可 - 如果输入是多个文档组成的JSON数组,在外层加一层循环遍历数组内的每个文档对象即可批量处理
- 代码默认用utf-8编码读写,如果源文件是gbk编码,替换
open函数里的encoding参数即可 - 同一句内相同标签的实体会按原文出现顺序拼接,如有去重需求可在处理实体时增加集合判断逻辑
内容的提问来源于stack exchange,提问作者David Esubalew
相关产品推荐
相关产品推荐

