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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:12:25