Python读取CSV文件时'utf-8'解码0xd5无效续字节错误如何解决
错误原因分析
这个报错是编码不匹配导致的,和3.17GB的文件体积完全无关,编码错误只和文件内容的字节格式有关,与文件大小没有任何关联。
你看到的“报错行和上一行内容完全相同”是误解:报错发生在csv.reader读取异常行、尝试解码为字符串的阶段,这一行根本没有被成功解析成列表,你拿到的所谓“触发报错的行”实际是上一次循环存储的正常行内容,所以看起来和上一行完全一致。真实的异常行中存在不符合UTF-8编码规则的字节,0xd5通常是GBK/GB2312编码中的中文字符首字节,也可能是不可见的特殊控制符、乱码字符。
解决方案
- 方案1:指定正确的文件编码打开
大多数Windows系统生成的CSV默认编码不是UTF-8,可尝试替换open语句的编码参数:# 尝试GBK编码,适合包含中文的Windows CSV文件 with open(filename, encoding='gbk') as csvfile: # 其他可选编码,报错可依次尝试: # encoding='cp1252' 欧美地区常用CSV编码 # encoding='utf-8-sig' 处理带BOM的UTF-8文件 - 方案2:忽略解码错误
如果不需要精准保留异常字节的内容,可添加错误处理参数跳过解码异常:
遇到无法解码的字节会自动替换为with open(filename, encoding='utf-8', errors='replace') as csvfile:�,不会中断程序运行。 - 方案3:二进制读取统计行数(适合仅统计行数的场景)
如果你只需要统计行数,完全不需要用csv.reader解析内容,二进制读取不会触发任何编码问题,大文件下效率高得多:def count_lines(filename): count = 0 # 二进制打开无编码问题 with open(filename, 'rb') as f: # 逐行迭代不占内存,适合3GB级大文件 for line in f: count += 1 # 减1对应你原本跳过表头的逻辑 return count - 1
内容的提问来源于stack exchange,提问作者Kevin G
相关产品推荐
相关产品推荐

