软硬件环境
- 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
接下来开始反序列化
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
,然后将它发送到在 Windows
或 MacOS
下运行的 Python
程序。而且,当 python
版本升级时,也不必担心已有的 pickle
操作出现问题,可以向后兼容。
Python实用模块专题
更多有用的 python
模块,请移步
https://xugaoxiang.com/category/python/modules/