如何确定Python Pandas读取CSV的正确编码并转码为UTF-8
CSV编码识别与转UTF-8解决方案
核心问题说明
Notepad++检测显示的ANSI不是具体编码名称,是Windows系统对本地默认代码页的统称,不代表文件的实际编码规则。cp1252是西欧/葡语区域Windows系统的默认ANSI代码页,但该编码在0x80-0x9F区间存在大量未定义字节位,你遇到的0x8d就属于cp1252未分配的字节,因此严格解码时会抛出UnicodeDecodeError。
1. 准确判定文件真实编码的方法
- 不要完全依赖文本编辑器的自动检测结果:编辑器的编码检测是启发式匹配,ANSI是所有非UTF类编码匹配失败后的兜底结果,参考价值有限。
- 使用字节级检测工具识别:用
chardet库直接读取文件原始二进制内容做检测,不要提前做解码操作,检测代码如下:
返回结果会包含检测到的编码名称、置信度,针对葡语命名的事故类数据集,常见返回结果为import chardet # 以二进制模式读取文件前10万字节即可,大文件无需全量读取 with open('acidentes-unchanged.csv', 'rb') as f: raw_bytes = f.read(100000) print(chardet.detect(raw_bytes))ISO-8859-1(别名latin1)、cp1252、cp850三类,如果置信度低于0.9,说明文件存在编码混杂、少量字节损坏的情况。 - 手动验证兜底:如果自动检测结果不准,按优先级逐个尝试上述三类葡语区域常用编码,以及
utf-8-sig(带BOM的UTF-8),验证时不要用严格解码模式,避免直接抛错中断。
2. 转码为通用UTF-8编码的方案
手动写字典映射转码的方式完全没必要,Python标准库自带的编解码逻辑可以覆盖所有合法字符映射,手动映射很容易出现错配、漏配问题,按以下两种场景处理即可:
- 场景1:文件无损坏,仅编码识别错误
优先尝试latin1编码读取,该编码对0-255范围内的所有字节都有对应字符映射,永远不会抛出解码错误。如果读取后葡语重音字符(ç、ã、õ、á等)显示正常,直接转存为UTF-8即可:import pandas as pd df = pd.read_csv('acidentes-unchanged.csv', encoding='latin1') # 写入时指定utf-8编码,不保留pandas默认索引 df.to_csv('acidentes-utf8.csv', encoding='utf-8', index=False) - 场景2:文件存在少量混杂/损坏的异常字节
读取时指定解码错误处理策略,跳过或替换无法识别的字节,避免程序中断,常用两种策略:errors='replace':无法解码的字节替换为�占位符,后续可以手动修正少量异常字符errors='ignore':直接跳过无法解码的字节
示例代码:
import pandas as pd df = pd.read_csv('acidentes-unchanged.csv', encoding='cp1252', errors='replace') df.to_csv('acidentes-utf8.csv', encoding='utf-8', index=False)
转码完成后建议抽查原文件报错位置附近的内容,如果只有极个别位置出现占位符,手动修正即可,不需要额外做全量字符映射。
内容的提问来源于stack exchange,提问作者Vinícius Sodré Quadros
相关产品推荐
相关产品推荐

