同一份CSV在一个工具正常,在另一个工具却出现乱码,未必是网站数据库已经损坏。周口企业处理产品资料导出时,可以先保存原文件并确认实际字节,再核对读取方式。本文只用虚构文字演示,不读取或修改真实客户文件。
文本与字节之间需要明确约定
import csv
import io
text = "title,language\n示例资料,zh\n"
raw = text.encode("utf-8-sig")
restored = raw.decode("utf-8-sig")
row = next(csv.DictReader(io.StringIO(restored)))
assert row["title"] == "示例资料"
# 示例只在内存中往返,不生成下载、不连接生产数据库。Python的编码资料说明utf-8-sig可以处理对应的签名。这里不等于要求所有CSV都必须加BOM,也不说明某个表格软件会永远采用相同识别方式。应按实际接收工具和项目约定测试,保留编码说明,而不是靠不断另存来碰运气。
沿资料经过的路径定位第一次变化
1源数据确认原始文字与字段含义。
2生成字节记录实际编码与分隔约定。
3下载核对取得的确是文件,而非错误页面。
4读取与导回按约定解码,确认文字和列名未变。
| 现象 | 先核对 | 避免 |
|---|---|---|
| 中文异常 | 字节编码与读取方式 | 反复覆盖唯一原件 |
| 首列名称多了字符 | 文件签名与解码 | 随意删除字段名 |
| 列错位 | CSV解析与分隔规则 | 只按逗号手工切割 |
| 文件内容是网页 | 实际响应与下载目标 | 误以为一定是编码问题 |
不要用容错选项掩盖损失
忽略解码错误可能让程序继续运行,但也可能静默丢掉信息。导入导出应有能够复核的异常记录,遇到无法确认的文本先停止自动覆盖。字符显示正常也不代表单位、编号与业务状态正确,那些仍需独立字段校验。
- 用包含中文、英文、引号和换行的专用样本。
- 检查列名、行数与代表字段。
- 验证下载、打开和再次导入的完整路径。
- 为失败样本保留原因,不默认跳过。
UTF-8是不是把中文翻成英文?
不是。编码处理字符与字节的表示,翻译是另一项内容工作。
文件能打开就算导出成功吗?
还要核对实际内容、字段和业务含义,不能只检查工具没有报错。