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

如何使用Python读取CSV数据并转换为Bratt(.ann)格式

CSV转Brat(.ann)格式Python实现

没有完全零配置适配所有CSV结构的通用现成脚本,毕竟不同来源的标注CSV字段定义、存储内容差异很大,但针对实体标注类的转换需求,下面的脚本不需要额外安装依赖,调整文件路径和字段映射后可以直接使用,输出格式完全符合Brat标注规范。

前置要求

  • 本地安装Python3环境即可,无需第三方库,脚本全用Python内置模块实现
  • 提前确认待转换CSV的核心字段:至少需要包含实体类型、实体起始字符偏移、实体结束字符偏移、实体文本内容四类信息

可直接运行的转换脚本

import csv
import os

def csv_to_ann(csv_input_path, ann_output_path):
    entity_counter = 1
    ann_content = []
    # 读取CSV内容
    with open(csv_input_path, 'r', encoding='utf-8') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        for row in csv_reader:
            # ==== 这里根据你的CSV实际列名修改对应的键名即可 ====
            ent_type = row['entity_type'].strip()
            start_pos = row['start_offset'].strip()
            end_pos = row['end_offset'].strip()
            ent_text = row['entity_text'].strip()
            # ==============================================
            
            # 严格按照Brat ann格式拼接行:制表符分隔编号段、位置段、文本段
            ann_line = f"T{entity_counter}\t{ent_type} {start_pos} {end_pos}\t{ent_text}"
            ann_content.append(ann_line)
            entity_counter += 1
    # 写入ann文件
    with open(ann_output_path, 'w', encoding='utf-8') as ann_file:
        ann_file.write('\n'.join(ann_content))

if __name__ == "__main__":
    # 修改为你本地的CSV文件路径
    INPUT_CSV = "./test_singlefile.csv"
    # 输出的ann文件路径,注意需要和对应原始文本txt文件同目录、同名(仅后缀不同)
    OUTPUT_ANN = "./test.ann"
    csv_to_ann(INPUT_CSV, OUTPUT_ANN)
    print(f"转换完成,文件已保存至:{os.path.abspath(OUTPUT_ANN)}")

注意事项

  • 如果运行时出现KeyError,说明代码里读取的字段名和你CSV实际的列名不匹配,把代码中标注的字段映射部分改成你CSV里的实际列名即可
  • 转换前确认CSV里存的偏移量是字符级偏移,不是词级偏移,所有文件统一用utf-8编码保存,否则会出现标注位置错位的问题
  • Brat加载标注要求同目录下必须存在和ann文件同名的txt原始文本文件,否则会加载失败
  • 如果你的CSV里还包含关系、事件类标注,只需要在脚本基础上追加对应格式的标注行即可,关系标注编号从R1开始累加,事件标注从E1开始累加,格式和实体标注逻辑一致。

内容的提问来源于stack exchange,提问作者David Esubalew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:30:36