欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

Python实用模块(二十三)pickle

实用模块 迷途小书童 3年前 (2020-11-03) 2752次浏览 0个评论

软硬件环境

  • windows 10 64bits
  • anaconda with python 3.7
  • pickle

视频看这里

此处是 youtube 的播放链接,需要科学上网。喜欢我的视频,请记得订阅我的频道,打开旁边的小铃铛,点赞并分享,感谢您的支持。

简介

pickle 模块实现了对一个 Python 对象结构的二进制序列化和反序列化。pickling 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 unpickling 是相反的操作,会将字节流转化回一个对象层次结构。

Python 中几乎所有的数据类型(列表,字典,集合,类等)都可以用 pickle 来序列化。

pickle的常用方法

pickle 模块提供了以下方法,让序列化和反序列化的过程更加方便

  • dump方法

    pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

    将对象obj序列化以后的对象写入已打开的文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。

  • dumps方法

    pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)

    obj封存以后的对象作为bytes类型直接返回,而不是将其写入到文件对象中。各参数与dump中的一样。

  • load方法

    pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

    从已打开文件对象中读取序列化后的对象,重建其中特定对象的层次结构并返回。

    pickle协议版本是自动检测出来的,所以不需要参数来指定协议。封存对象以外的其他字节将被忽略。

  • loads方法

    pickle.loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

    重建并返回data的对象层级结构。data是序列化后的bytes对象。

示例代码

首先,来看看序列化的过程,分别将字符串、字典和列表进行序列化,使用 dump 方法

(demo) PS C:\Users\Administrator> ipython
Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: aString = 'xugaoxiang.com'

In [2]: aDict = {'p': 'python', 'r': 'rust', 's': 'swift'}

In [3]: aList = ['one', 'two', 'three']

In [5]: f = open('test.pkl', 'wb')

In [6]: pickle.dump(aString, f, True)
<IPython.core.display.Javascript object>

In [7]: pickle.dump(aDict, f, True)
<IPython.core.display.Javascript object>

In [8]: pickle.dump(aList, f, True)
<IPython.core.display.Javascript object>

In [9]: f.close()

In [10]:

这时候,在目录 C:\Users\Administrator 下就生成了二进制文件 test.pkl

pickle

接下来开始反序列化

In [11]: f = open('test.pkl', 'wb')

In [12]: pickle.dump(aString, f, True)
<IPython.core.display.Javascript object>

In [13]: pickle.dump(aDict, f, True)
<IPython.core.display.Javascript object>

In [14]: pickle.dump(aList, f, True)
<IPython.core.display.Javascript object>

In [15]: f.close()

In [16]: f1 = open('test.pkl', 'rb')

In [17]: lString = pickle.load(f1)
<IPython.core.display.Javascript object>

In [18]: lString
Out[18]: 'xugaoxiang.com'

In [19]: lDict = pickle.load(f1)
<IPython.core.display.Javascript object>

In [20]: lDict
Out[20]: {'p': 'python', 'r': 'rust', 's': 'swift'}

In [21]: lList = pickle.load(f1)
<IPython.core.display.Javascript object>

In [22]: lList
Out[22]: ['one', 'two', 'three']

In [23]: f1.close()

通过以上代码,可以看到反序列化的过程跟序列化的顺序一样,这一点跟数据结构中的队列很像。

文件对象不可以序列化

python 不能序列化文件对象,或者任何带有对文件对象引用的对象,因为在反序列化时无法保证它可以重建该文件的状态。看下面的示例

In [32]: f = open('test.pkl', 'wb')

<IPython.core.display.Javascript object>
In [33]: p = pickle.dumps(f)
<IPython.core.display.Javascript object>
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-671076828a70> in <module>
----> 1 p = pickle.dumps(f)

TypeError: cannot serialize '_io.BufferedWriter' object

In [34]:

可移植性

pickle 文件格式独立于机器的体系结构,这也就意味着,可以在 linux 下创建一个 pickle,然后将它发送到在 WindowsMacOS 下运行的 Python 程序。而且,当 python 版本升级时,也不必担心已有的 pickle 操作出现问题,可以向后兼容。

Python实用模块专题

更多有用的 python 模块,请移步

https://xugaoxiang.com/category/python/modules/

参考资料

喜欢 (0)

您必须 登录 才能发表评论!

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.