Python读取txt文件报'utf-8' codec can't decode byte 0xd5错误如何解决
报错含义
这个报错是Python的字符解码异常,意思是程序使用utf-8编码规则解析目标文件的二进制内容时,在内容的第18个字节位置遇到了值为0xd5的字节,该字节不符合utf-8编码的字符规则,无法被正常解码为文本。
报错原因
你两次运行代码指定的都是utf-8编码(首次运行不指定encoding参数时,Python默认会使用当前系统的默认编码,大部分设备默认编码就是utf-8),但目标txt文件本身并不是以utf-8编码保存的:
- 如果是中文场景下生成的txt,大概率是用GBK、GB2312编码保存的,
0xd5刚好是GBK编码中很多中文字符的首字节,在utf-8规则中属于非法字节 - 少数情况也可能是文件本身损坏,或者是Latin1、cp1252等其他区域编码的文件
解决方案
- 优先尝试替换编码参数:如果是中文环境下的文件,先把encoding参数改为GBK重试:
with open(apple, encoding='gbk') as f: print(f.read())
- 不确定文件编码时,可以使用
chardet库自动检测编码:- 先安装依赖:
pip install chardet - 运行检测代码:
- 先安装依赖:
import chardet with open(apple, 'rb') as f: # 读取前1024个字节检测编码,大文件可以适当调大读取长度 result = chardet.detect(f.read(1024)) print(result['encoding']) # 输出检测到的编码,替换到open的encoding参数即可
- 无需严格保证内容完整性时,可以添加错误处理参数跳过解码异常:
# ignore表示直接忽略无法解码的字节,replace表示用�替换无法解码的字符 with open(apple, encoding='utf-8', errors='ignore') as f: print(f.read())
- 不需要即时转文本的场景,也可以用二进制模式直接读取文件内容自行处理:
with open(apple, 'rb') as f: content = f.read()
内容的提问来源于stack exchange,提问作者boomer
相关产品推荐
相关产品推荐

