Python初学者解码bytes序列报UnicodeDecodeError该如何处理?
问题原因与解决方案
为什么你用decode()会报错
bytes.decode()方法仅适用于文本编码生成的字节序列(比如UTF-8、GBK编码的文本字节),你手里的enc不是文本编码结果,是Python内置pickle模块序列化Python对象生成的二进制结构化数据,开头的\x80就是pickle序列化数据的固定魔术标识,自然无法用UTF-8文本解码规则解析,所以触发了UnicodeDecodeError。
正确的解码方式
你需要用pickle模块的反序列化方法加载该字节序列:
import pickle enc = b'\x80\x03}q\x00(K\x01K\x01K\x02K\x03K\x03K\x06K\x04G?\xc5UUUUUUK\x05G?\xe0\x00\x00\x00\x00\x00\x00K\x06G?\x9cq\xc7\x1cq\xc7\x1cK\x07G?\xc5UUUUUUK\x08K$K\tG?\xb5UUUUUUK\nK\x07K\x0bG?\xe5UUUUUUK\x0cG?\xb5UUUUUUK\rG?\xedUUUUUUK\x0eK4K\x0fG?\xb3\xb1;\x13\xb1;\x14K\x10K\x00K\x11G?\xcd\x89\xd8\x9d\x89\xd8\x9eK\x12G?\xcb\x9b\x9b\x9b\x9b\x9b\x9cK\x13G?\xa4\x14\x14\x14\x14\x14\x14K\x14X\x08\x00\x00\x00discretaq\x01K\x15K\x02K\x16X\x02\x00\x00\x00daq\x02K\x17G?\xe4z\xe1G\xae\x14{K\x18G@\x15\x00\x00\x00\x00\x00\x00K\x19G?\xe4z\xe1G\xae\x14|K\x1aK2K\x1bK\x01K\x1cK\x03K\x1dG?\xd5UUUUUUK\x1eG?\xc5UUUUUUK\x1fK\x01K K\x04K!G?\xaf\xf2\xe4\x8e\x8aq\xdeK"K\x04K#X\x04\x00\x00\x00mareq\x03u.' result = pickle.loads(enc) print(result)
运行后会得到反序列化后的Python字典对象,包含整数、浮点数、字符串三类值。
核心原理说明
- 字节序列分两类:一类是文本编码产物,需要用对应字符编码规则解码为字符串;另一类是结构化二进制数据(比如pickle序列化结果、图片、压缩包),需要用对应的格式解析工具处理,不能混用文本解码方法。
- pickle是Python专属的序列化工具,可以把任意Python对象转成二进制字节序列存储/传输,使用时需要用
pickle.loads()把字节序列还原为原始Python对象。
注意:不要加载任何来路不明的pickle序列化数据,pickle反序列化过程会执行数据中包含的代码,存在远程代码执行风险。
内容的提问来源于stack exchange,提问作者user14399919
相关产品推荐
相关产品推荐

