You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:03:36