具体错误描述
最近在处理一些pkl文件,安装了pickle这个三方库之后,我打算使用pickle.load(open(’XXX‘))的方法来打开pkl文件,结果报错了。pkl文件就是把数据转成二进制进行存储。
pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,
pickle序列化后的数据,可读性差,人一般无法识别。说白了Pickle文件就是把数据转成二进制进行存储,是给机器看的不是给人看的。
上述我们已经说过了pickle序列化后的数据是二进制,那也就是说把文件作为二进制存储后,对于文件的读取会非常的快。如果有一个每个sheets为上万行的Excel,当我们直接读取这个excel文件后果你懂得。。有的小伙伴可能会说转成csv后进行读取,是的转csv后确实会比之前的xlsx格式的读取来的快些。但是读取之前计算机依然需要编译后再读取。文件一大还是很慢。那么这时候Pickle的优点就显现出来了。理解的pkl文件是二进制文件后具体看一下报错情况。
报错情况如下:
import pickle #import cPickle as pickle inf = pickle.load(open('/root/气动仿真/NACA0012_DATA/train_max_min.pkl')) --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) Input In [25], in <cell line: 3>() 1 import pickle 2 #import cPickle as pickle ----> 3 inf = pickle.load(open('/root/气动仿真/NACA0012_DATA/train_max_min.pkl')) File /anaconda3/lib/python3.9/codecs.py:322, in BufferedIncrementalDecoder.decode(self, input, final) 319 def decode(self, input, final=False): 320 # decode input (taking the buffer into account) 321 data = self.buffer + input --> 322 (result, consumed) = self._buffer_decode(data, self.errors, final) 323 # keep undecoded input until the next call 324 self.buffer = data[consumed:] UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
很明显这是一个编码问题,在解码的过程中发生了错误,与此类似的还有一个常见错误如下:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
具体解决方法
报错的原因就是不能正确的解码0x80这个字节了,也就是这个字节超出了utf-8的表示范围了,
inf = pickle.load(open('/root/气动仿真/NACA0012_DATA/train_max_min.pkl'))
在load里面加上了‘rb’就解决了。
解决之后现象
1.# -*- coding: utf-8 -*- import pickle #import cPickle as pickle inf = pickle.load(open('/root/气动仿真/NACA0012_DATA/train_max_min.pkl','rb')) print(inf)