打开pkl文件提示解码错误解决方法

目录

 

具体错误描述

具体解决方法

解决之后现象


具体错误描述

最近在处理一些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 ()
      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’就解决了。

解决之后现象

# -*- coding: utf-8 -*-
import pickle
#import cPickle as pickle 
inf = pickle.load(open('/root/气动仿真/NACA0012_DATA/train_max_min.pkl','rb'))
print(inf)

打开pkl文件提示解码错误解决方法_第1张图片

 正确的把pkl文件中的二进制文件解码并打印了出来。

你可能感兴趣的:(python入门,python,开发语言)