清洗脚本读 csv 时中文变成问号,训练出来的模型偶尔输出乱码字符,日志里也夹着看不懂的符号。
一开始怀疑是「混合了多种编码的文件被统一处理」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。文件是 GBK 编码,读取时按 UTF-8 解码。还有一种是Excel 导出的 csv 带 BOM,首列字段名被污染。
少数情况下是写入时用了系统默认编码。
第一件事是检测文件真实编码
python -c "import chardet;print(chardet.detect(open('data.csv','rb').read(20000)))"
再往下按检测结果指定编码读取
python -c "import pandas as pd;print(pd.read_csv('data.csv', encoding='gb18030').head())"
随后写入时固定 UTF-8 并去掉 BOM
python -c "open('out.jsonl','w',encoding='utf-8-sig').write('')"
等前面都确认过,再抽查样本里是否有替换字符
python -c "print(sum('\ufffd' in l for l in open('out.jsonl',encoding='utf-8')))")
别只看报错消失,验证要多做一步。读入的文本没有替换字符,抽样检查中文正常,训练输出不再出现乱码片段。
带 BOM 的文件首行字段名会多出不可见字符,用字段名取值时会莫名报 KeyError,读入后先检查第一行。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。