大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
Python ‘gbk’ codec can’t decode byte 0x80
前段时间,运行得好好的 Python
代码突然抛出如下错误:
Traceback (most recent call last):
File "C:\***\tools.py", line 367, in __get_key_from_sym
line = file.readline()
File "C:\Python\Python35-32\lib\codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 3223: invalid start byte
从错误提示来看,应该是文件编码的问题,文件中含有 gbk
无法解码的内容,某个字符的起始字节为 0x80
,不在 gbk
的编解码范围内。其对应的源码如下:
@staticmethod def __get_key_from_sym(sym): with open(sym) as file: line = file.readline() if line: keys = line.split() if len(keys) >= 4: return keys[3]
如上代码所示,先是以文件流的形式打开 sym
文件,然后逐行读取文件,直至找到所需内容。错误出在 line = file.readline()
一行,原因在于其上一行 open(sym)
使用的编解码格式不适合。在未指定编解码格式的情况下,open(sym)
会使用平台相关的编解码器来解析文件,此处使用的是 gbk
,而 0x80
不是 gbk
能够识别的起始字节。
解决方案
尝试将编解码格式设置为 UTF8
等,即 with open(sym, encoding='UTF8') as file
,仍然无法解决问题。虽然无法确定 sym
文件的编码格式,但是此处所需的内容在文件的首行,可以确保的是首行中没有无法识别的特殊字符,所以可以先以 二进制
方式打开文件,然后将读取出来的内容使用某个格式来解码:
@staticmethod def __get_key_from_sym(sym): with open(sym, "rb") as file: # 文件编码不确定,以二进制方式打开 line = file.readline() if line: keys = line.decode("utf-8").split() # 尝试用 utf-8 来解码(相关行无特殊字符) if len(keys) >= 4: return keys[3]
当然,此处只是规避了问题,如果要从根本上解决问题,还是要选择合适的编解码格式。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197608.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...