Pandas读取CSV遇UnicodeDecodeError,用ISO-8859-1可行存疑
问题分析与解决方案
核心原因
你遇到的问题本质是文件中混入了ASCII编码范围外的字节(0xa0是ISO-8859-1中的不间断空格),而chardet因为文件大部分内容是ASCII,误判了整体编码。对方称未修改编码,大概率是内容层面引入了特殊字符(比如从富文本编辑器复制内容时带进来的),而非编码格式本身变更。
当前方案的安全性
用encoding='ISO-8859-1'是可行的临时方案,原因如下:
- ISO-8859-1是单字节编码,能覆盖所有0x00-0xFF的字节,不会出现解码报错
- ASCII是ISO-8859-1的子集,之前的CSV文件用它读取完全兼容,不会破坏原有内容
但要注意:0xa0这类字符读入后会变成Unicode的\xa0,如果后续需要处理文本(比如匹配、入库),建议把它替换成普通空格:
import pandas as pd df = pd.read_csv('your_file.csv', encoding='ISO-8859-1') # 替换所有不间断空格为普通空格 df = df.replace(r'\xa0', ' ', regex=True)
长期优化建议
定位特殊字符来源
找到报错位置的字符(用open('your_file.csv', 'rb').read()[208420:208430]查看附近字节),把这个字符的内容反馈给对方,确认是不是业务内容里的合理字符,还是误引入的垃圾字符。推动统一编码为UTF-8
建议对方导出CSV时明确选择UTF-8编码(很多工具默认是本地编码,比如Windows的GBK),UTF-8是通用编码,能兼容所有语言字符,从根源避免编码问题。添加容错读取逻辑
为了避免后续再出类似问题,可以在代码里加一个 fallback 机制:
def read_csv_safe(file_path): try: # 先尝试原方式读取 return pd.read_csv(file_path) except UnicodeDecodeError: # 报错时切换到ISO-8859-1,并记录日志 print(f"Warning: File {file_path} has non-ASCII bytes, using ISO-8859-1 encoding") return pd.read_csv(file_path, encoding='ISO-8859-1') df = read_csv_safe('your_file.csv')
内容的提问来源于stack exchange,提问作者punsoca
相关产品推荐
相关产品推荐

