已解决:UnicodeDecodeError: ‘gb2312‘ codec can‘t decode byte 0xe5 in position 1

起因

python 读文件报错。这个报错不是来自open而是read函数(请看最后部分)。
原因:文件编码不一致。
比如文件本身编码为 gb2312,而 python默认以 utf-8 编码打开,报错。

解决

初级:以通用的 utf-8 编码打开。

with open(file_path, 'r', encoding=‘utf-8’) as file:
    code = file.read()

问题:文件本身编码非 utf-8 能够解析的编码,比如gbk,就无法打开了。


中级:先读取文件编码,然后用该编码打开

with open(file_path, 'rb') as file:
    content = file.read()
    encoding = chardet.detect(content)['encoding']
    print("编码为:" + encoding) 
with open(file_path, 'r', encoding=encoding) as file:
    content = file.read()

问题:当文件本身已经存在部分乱码时,无法打开。


高级:ignore:忽略无法解码或编码的字符,直接跳过。

 try:
     with open(file_path, 'rb') as file:
         content = file.read()
         encoding = chardet.detect(content)['encoding']
         
     with open(file_path, 'r', encoding=encoding, errors='ignore') as file:
         content = file.read()
 except Exception as e:
     logging.error(e)

解释:
errors参数解释
errors是一个可选字符串,用于指定如何处理编码和解码错误——不能在二进制模式中使用。

errors 常用的参数值:
在这里插入图片描述

strict:当遇到无法解码或编码的字符时,抛出 ValueError 异常。也是默认值。(解释:UnicodeDecodeError 实际是 read()函数报的错,不是open函数报的
ignore:忽略无法解码或编码的字符,直接跳过,会缺失这部分内容
replace:将畸形数据替换为指定字符(比如问号’?')。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值