AI 训练 CSV 读错列怎么办?处理 BOM、引号和字段内换行

训练 CSV 错列时用 DictReader 核对明确列协议,处理 UTF-8 BOM、字段内逗号、双引号和换行,并保留样本 ID 的前导零。

训练文本的 CSV 读取后出现错列、标题多出隐藏字符或一条样本变成两行,先检查文件解析规则。逗号、引号和字段内换行都可能是合法文本内容;把每行按逗号 split,会把带标点的训练句子与标签拆错。

本文只修正 CSV 传输格式,不自动填补缺失特征或训练模型。样本 ID、文本与标签都是教学数据;对自己的语料要使用已确认的编码、列定义和标签协议。

AI 训练 CSV 读错列怎么办?处理 BOM、引号和字段内换行

为什么行数和样本数可能不相同

合法 CSV 可以用引号包住带逗号或换行的字段,双引号本身也需要转义。Python 官方 csv 文档说明文件应以 newline=” 打开,并提供 DictReader、DictWriter 来处理这些规则。reader.line_num 表示读取的物理行数,不等同于返回的记录数。

本文约定列顺序为 sample_id,text,label。ID 作为字符串保留,0007 不能自动转成整数 7,否则可能失去与标注表对应的标识。

创建一个含 BOM 与特殊文本的示例

保存为 csv_check.py,执行 python csv_check.py。这段代码会覆盖练习目录的 demo_training.csv,不能把该名称替换成原始语料后运行创建部分。

import csv
from pathlib import Path

path = Path("demo_training.csv")
fields = ["sample_id", "text", "label"]
with path.open("w", encoding="utf-8-sig", newline="") as stream:
    writer = csv.DictWriter(stream, fieldnames=fields)
    writer.writeheader()
    writer.writerows([
        {"sample_id": "0007", "text": '用户说:"没有收到,请核实"', "label": "物流"},
        {"sample_id": "0008", "text": "第一行问题\n第二行补充条件", "label": "其他"},
    ])

records = []
with path.open(encoding="utf-8-sig", newline="") as stream:
    reader = csv.DictReader(stream)
    if reader.fieldnames != fields:
        raise ValueError(f"标题不符合协议:{reader.fieldnames!r}")
    for number, row in enumerate(reader, start=1):
        if None in row or any(value is None for value in row.values()):
            raise ValueError(f"第 {number} 条记录的字段数量不符")
        if not row["sample_id"] or not row["text"]:
            raise ValueError(f"第 {number} 条记录缺少 ID 或文本")
        records.append(row)
    physical_lines = reader.line_num

assert len(records) == 2
assert records[0]["sample_id"] == "0007"
assert records[0]["text"] == '用户说:"没有收到,请核实"'
assert records[1]["text"] == "第一行问题\n第二行补充条件"
print("records:", len(records), "physical_lines:", physical_lines)
for row in records:
    print(row["sample_id"], repr(row["text"]), row["label"])

Python 官方编码说明介绍 utf-8-sig:解码时可跳过文件开头的 UTF-8 BOM。使用 utf-8 读取带 BOM 的文件,首个列名可能变成带 U+FEFF 的字符串,导致看似正确的 sample_id 检查失败;不要改业务字段名来迁就它。

怎样判断修好了

固定示例应返回两条样本,0007 的前导零、原文中的逗号和双引号都保留;0008 的文本仍含一个换行,而不是新增一条没有 ID 的样本。repr 会把换行显示成转义形式,便于核对。

字段数量异常会在训练前停止。DictReader 遇到额外字段会放入特殊键,缺少字段会产生 None;代码分别检测这两种情况。这里还要求标题顺序完全一致,方便按明确协议处理,真实项目可制定自己的列顺序规则。

换成实际语料时的读取步骤

  1. 先备份或只读原文件,确认导出工具给出的编码与分隔符。别凭“能打开”推断整份文件没有乱码。
  2. 删除示例创建部分,只保留读取器,改为实际路径和已确认字段。
  3. 抽查含逗号、引号、中文和多行文字的样本,核对 ID、原文、标签仍一一对应。
  4. 用记录数统计有效样本,而不是操作系统按换行统计的行数。需要海量读取时按记录逐条处理,不把全部 records 长期保存在内存中。

不要用这些办法掩盖格式问题

  • 不把所有逗号替换掉,它们可能是原文事实的一部分。
  • 不直接删除全部换行,换行可能区分题目和补充条件。
  • 不使用 errors=’ignore’ 静默丢弃无法解码的字节;先确认来源编码并记录失败位置。
  • 不把标签列错位解释成“模型效果不好”,先修数据读取。

本例的结果只说明教学 CSV 解析正确,不证明原始标签可靠。下一步是选几条真实复杂文本,按相同方式回查字段和样本 ID,再交给训练集审核或 DataLoader。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31984.html

赞 (0)
AI小管家的头像AI小管家
Qdrant 向量库怎么导出重建?逐页保存向量和 payload 并核对 ID
上一篇 2小时前
AI 训练 JSONL 怎么检查?逐行校验字段并保存错误记录
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部