训练文本的 CSV 读取后出现错列、标题多出隐藏字符或一条样本变成两行,先检查文件解析规则。逗号、引号和字段内换行都可能是合法文本内容;把每行按逗号 split,会把带标点的训练句子与标签拆错。
本文只修正 CSV 传输格式,不自动填补缺失特征或训练模型。样本 ID、文本与标签都是教学数据;对自己的语料要使用已确认的编码、列定义和标签协议。

为什么行数和样本数可能不相同
合法 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;代码分别检测这两种情况。这里还要求标题顺序完全一致,方便按明确协议处理,真实项目可制定自己的列顺序规则。
换成实际语料时的读取步骤
- 先备份或只读原文件,确认导出工具给出的编码与分隔符。别凭“能打开”推断整份文件没有乱码。
- 删除示例创建部分,只保留读取器,改为实际路径和已确认字段。
- 抽查含逗号、引号、中文和多行文字的样本,核对 ID、原文、标签仍一一对应。
- 用记录数统计有效样本,而不是操作系统按换行统计的行数。需要海量读取时按记录逐条处理,不把全部 records 长期保存在内存中。
不要用这些办法掩盖格式问题
- 不把所有逗号替换掉,它们可能是原文事实的一部分。
- 不直接删除全部换行,换行可能区分题目和补充条件。
- 不使用 errors=’ignore’ 静默丢弃无法解码的字节;先确认来源编码并记录失败位置。
- 不把标签列错位解释成“模型效果不好”,先修数据读取。
本例的结果只说明教学 CSV 解析正确,不证明原始标签可靠。下一步是选几条真实复杂文本,按相同方式回查字段和样本 ID,再交给训练集审核或 DataLoader。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31984.html