Python ‘gbk’ codec can’t decode byte 0x80[通俗易懂]

Python ‘gbk’ codec can’t decode byte 0x80[通俗易懂]Python‘gbk’codeccan’tdecodebyte0x80前段时间,运行得好好的Python代码突然抛出如下错误:Traceback(mostrecentcalllast):File"C:\***\tools.py",line367,in__get_key_from_symline=file.readline()F…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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] 

当然,此处只是规避了问题,如果要从根本上解决问题,还是要选择合适的编解码格式。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197608.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 遇到“备份集中的数据库备份与现有XXX数据库不同”的错误

    遇到“备份集中的数据库备份与现有XXX数据库不同”的错误当在使用另外一台的数据库备份文件.bak恢复到本机数据库时,遇到“备份集中的数据库备份与现有XXX数据库不同”的错误,后直接登录本机SQLServer数据库master,新建查询,并执行以下命令:    RESTOREDATABASE[XXX]FROM     DISK=NG:/data/zt20080720.bakWITH FILE=1,     NOUNLOA

    2022年6月3日
    34
  • Django组件_django路由path

    Django组件_django路由path什么是Django中间件中间件(Middleware)是一个用来处理Django的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改

    2022年7月31日
    3
  • Mybatis中JdbcType的使用[通俗易懂]

    Mybatis中JdbcType的使用[通俗易懂]MyBatis插入空值时,需要指定JdbcTypemybatisinsert空值报空值异常,但是在PL/SQL不会提示错误,主要原因是mybatis无法进行转换jdbcType的使用场合,只有当在insert,update和delete中有空字段时,需要使用jdbcType。MyBatis包含的jdbcType类型BIT、FLOAT、CHAR、TIMESTAMP、OTHE…

    2022年10月20日
    0
  • el-table自适应宽度_表格自适应大小

    el-table自适应宽度_表格自适应大小不要设置width=”110px”<el-table-columnprop=”login_id”align=”center”label=”工号”></el-table-column><el-table-columnprop=”login_id”width=”110px”align=”center”label=”工号…

    2022年9月7日
    0
  • pandas.read_csv() 报错 OSError: Initializing from file failed,报错原因分析和解决方法

    pandas.read_csv() 报错 OSError: Initializing from file failed,报错原因分析和解决方法pandas.read_csv()报错OSError:Initializingfromfilefailed,一般由两种情况引起:一种是函数参数为路径而非文件名称,另一种是函数参数带有中文。

    2022年6月24日
    23
  • redis穿透 击穿_redis缓存穿透和雪崩

    redis穿透 击穿_redis缓存穿透和雪崩​1、redis雪崩、穿透、击穿的原因和解决方案1)雪崩:多个key在某一时间同时失效,导致数据库压力过大解决方案:不同的key设置不同的过期时间,尽量错开2)穿透:在访问某个key时缓存中不存在,导致每次查询都会访问数据库解决方案:第一次访问时如果key不存在,则在缓存中设置一个空值,并设置较短的过期时间3)击穿:单个key缓存突然失效,这时大量的请求进行访问,导致数据压力过大解决方案:1、双重检索机制:某个key只让一个线程查询,阻塞其他线程 privatestati

    2022年9月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号