pandas读取csv文件报utf-8无法解码0x80字节错误如何解决
问题原因
pandas的read_csv方法默认使用utf-8编码解析文件内容,当目标CSV文件实际存储编码不是UTF-8时,就会触发这类解码报错。你看到的0x80字节不符合UTF-8的编码规则(UTF-8多字节序列的起始字节取值有明确范围,0x80属于后续字节的取值范围,不能出现在起始位置),因此抛出invalid start byte错误。
常见触发场景:
- 文件是用GBK/GB2312等中文编码、CP1252(Windows ANSI)、Latin-1、UTF-8 BOM等非纯UTF-8编码保存的
- 文件后缀被手动改成.csv,实际是xls/xlsx等二进制Excel文件
- 文件传输/下载过程中损坏,出现不符合编码规则的异常字节
可行解决方法
按优先级从高到低尝试以下方案:
- 优先手动指定匹配的文件编码
日常场景下绝大多数编码不匹配问题,都可以通过传入encoding参数解决,按文件来源挨个测试常用候选编码即可:- 国内Windows系统下Excel直接导出的CSV,优先试GBK编码:
import pandas as pd df = pd.read_csv('property.csv', encoding='gbk')- Windows系统下带BOM头的UTF-8格式CSV,试
utf-8-sig编码:
df = pd.read_csv('property.csv', encoding='utf-8-sig')- 西欧语言导出、含特殊符号的CSV,试Latin-1/CP1252编码:
df = pd.read_csv('property.csv', encoding='latin-1') # 上一行不行就替换成cp1252 # df = pd.read_csv('property.csv', encoding='cp1252') - 编码自动检测
如果手动试编码效率低,可以用chardet库自动识别文件编码,再传入pandas读取:
先安装依赖:pip install chardet
实现代码:import chardet import pandas as pd # 读取文件前10000字节的二进制内容做编码检测,大文件也能快速出结果 with open('property.csv', 'rb') as f: file_encoding = chardet.detect(f.read(10000))['encoding'] df = pd.read_csv('property.csv', encoding=file_encoding) - 排查假CSV/文件损坏问题
如果所有编码都试完仍报错,先验证文件有效性:- 用系统自带记事本打开
property.csv,如果弹出格式不兼容提示、打开后全是乱码/二进制乱符,说明文件不是纯文本CSV:如果是硬改后缀的Excel文件,改用pd.read_excel('property.csv')读取即可 - 如果文件是从网络/其他设备传输得到,重新下载/拷贝源文件,排除传输损坏问题
- 用系统自带记事本打开
- 临时跳过错误(不推荐正式场景使用)
如果只需要快速读取文件做验证,不在乎少量乱码/字符丢失,可以加参数跳过解码失败的字节:
注意:该方式会直接丢弃所有无法解码的字节,可能导致字段内容缺失、数据不准,不要用于正式数据处理流程。df = pd.read_csv('property.csv', encoding='utf-8', errors='ignore')
内容的提问来源于stack exchange,提问作者Muhammad kamran khan
相关产品推荐
相关产品推荐

