使用utf-8编码解码pandas导出的CSV文件仍触发UnicodeError如何解决
问题根源
报错信息中提到charmap编码,说明解码环节并未使用你指定的UTF-8规则,问题出在代码写法的逻辑错误:
你在调用open()打开文件时没有指定编码,在Windows系统环境下open()函数默认使用系统区域对应的字符集(属于charmap类编码,比如简体中文系统默认是GBK、英文系统默认是cp1252)解码文件内容,此时已经触发了解码错误。你后续传给pd.read_csv的encoding='utf-8'参数不会生效,因为read_csv接收到的是已经经过open()解码的文件对象,不会再做二次解码处理。
排查步骤
- 确认导出文件编码:用文本编辑器(如Notepad++)打开导出的
myfile.csv,查看右下角标注的编码格式,确认是否为UTF-8(部分场景下可能是带BOM的UTF-8) - 验证本地open默认编码:运行以下代码确认系统默认编码:
import locale print(locale.getpreferredencoding(False))
如果输出结果不是utf-8,即可确认是open默认编码导致的问题。
解决方案
方案1:直接传入文件路径给read_csv(推荐)
pd.read_csv原生支持直接传入文件路径,会自动处理编码逻辑,写法更简洁:
import pandas as pd csv = pd.read_csv('myfile.csv', encoding='utf-8', index_col=False)
方案2:open时指定编码
如果你需要提前拿到文件对象做其他处理,将编码参数加在open方法中即可:
import pandas as pd with open('myfile.csv', 'r', encoding='utf-8') as f: csv = pd.read_csv(f)
特殊场景适配
如果确认文件是带BOM的UTF-8编码,将编码参数改为utf-8-sig即可正常读取:
csv = pd.read_csv('myfile.csv', encoding='utf-8-sig')
如果不确定文件编码,可以用chardet库检测后再读取:
import chardet # 二进制模式读取文件内容检测编码 with open('myfile.csv', 'rb') as f: encode_info = chardet.detect(f.read()) # 用检测到的编码读取文件 csv = pd.read_csv('myfile.csv', encoding=encode_info['encoding'])
内容的提问来源于stack exchange,提问作者Pedro Kaneto Suzuki
相关产品推荐
相关产品推荐

