应使用 utf-8-sig 编码:它能自动识别并跳过 utf-8 bom(\xef\xbb\xbf),避免列名或首行出现 \ufeff;pandas 读取必须显式指定 encoding='utf-8-sig',否则可能报错或污染数据。

为什么用 utf-8-sig 而不是 utf-8
Windows 上用 Excel 保存的 CSV 文件,常在开头自带 BOM(Byte Order Mark),即三个不可见字节 \xef\xbb\xbf。如果用 utf-8 打开,pandas 或内置 open() 会把 BOM 当作真实字符读入第一列列名或首行数据,导致列名变成 '\ufeff姓名' 或首行数据前多出乱码。而 utf-8-sig 是 Python 特殊编码别名:它能自动识别并跳过 BOM,后续内容仍按 UTF-8 解码——不改文件、不丢数据、不报错。
pandas 读取时必须显式指定 encoding='utf-8-sig'
默认情况下,pandas.read_csv() 在 Windows 上可能 fallback 到系统编码(如 gbk),遇到 UTF-8 BOM 文件就直接报 UnicodeDecodeError;即使没报错,BOM 也会污染列名。解决方式很简单:
import pandas as pd
df = pd.read_csv('data.csv', encoding='utf-8-sig')
注意:encoding 参数不能省略,也不能写成 utf8 或 UTF-8(大小写敏感,且必须带 -sig 后缀)。
用内置 open() + csv 模块时同样要设 encoding='utf-8-sig'
如果你不用 pandas,而是手动逐行解析(比如处理超大文件或需要精细控制),csv.reader 必须配合带 BOM 处理能力的编码:
从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
import csv
with open('data.csv', encoding='utf-8-sig') as f:
reader = csv.reader(f)
for row in reader:
print(row) # 第一行列名已干净,无 \ufeff
常见错误包括:
- 漏写
encoding参数 → 触发系统默认编码,中文变???? - 写了
encoding='utf-8'→ BOM 被当字符,首列名开头多一个\ufeff - 用
codecs.open(..., 'utf-8-sig')→ 不必要,Python 3.7+ 原生open()已支持
其他编码场景下不要硬套 utf-8-sig
utf-8-sig 只对带 BOM 的 UTF-8 文件有效。如果文件是 GBK 编码(比如老版 Excel 直接另存为 CSV),强行用 utf-8-sig 会解码失败或显示乱码。此时应:
- 先用文本编辑器(如 VS Code、Notepad++)确认真实编码
- 再选对应编码,例如
encoding='gbk'或encoding='gb18030' - 不确定时可试
chardet库探测:chardet.detect(open('data.csv', 'rb').read(10000))
BOM 是 Windows CSV 的隐形陷阱,不显式声明 utf-8-sig 就等于默认放弃兼容性。很多人调了半小时 errors='ignore' 或正则清洗列名,其实只差一个参数。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










