企业建站源代码,室内设计师培训网,有那种网站的浏览器,中国建设银行网站网上银行迷途小书童的 Note 读完需要 7分钟 速读仅需 3 分钟 大家好#xff0c;我是迷途小书童#xff01; 在 Python 开发中#xff0c;我们经常需要将对象数据保存到磁盘#xff0c;或者通过网络传输对象信息。这时就需要序列化#xff0c;Pickle 库为我们提供了极为方便的对象序… 迷途小书童的 Note 读完需要 7分钟 速读仅需 3 分钟 大家好我是迷途小书童 在 Python 开发中我们经常需要将对象数据保存到磁盘或者通过网络传输对象信息。这时就需要序列化Pickle 库为我们提供了极为方便的对象序列化功能。本文将全面解析 Pickle 的工作机制、典型应用及示例代码希望可以帮助初学者快速掌握这个实用的内置模块。 1 简介 pickle 模块实现了对一个 Python 对象结构的二进制序列化和反序列化。pickling 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程而 unpickling 是相反的操作会将字节流转化回一个对象层次结构。 Python 中几乎所有的数据类型(列表字典集合类等)都可以用 pickle 来序列化。 2 常用方法 pickle 模块提供了以下方法让序列化和反序列化的过程更加方便 dump 方法pickle.dump(obj, file, protocolNone, *, fix_importsTrue, buffer_callbackNone)将对象 obj 序列化以后的对象写入已打开的文件对象中。参数 protocol 是序列化模式默认值为 0表示以文本的形式序列化。protocol 的值还可以是 1 或 2表示以二进制的形式序列化。dumps 方法pickle.dumps(obj, protocolNone, *, fix_importsTrue, buffer_callbackNone)将 obj 封存以后的对象作为 bytes 类型直接返回而不是将其写入到文件对象中。各参数与 dump 中的一样。load 方法pickle.load(file, *, fix_importsTrue, encodingASCII, errorsstrict, buffersNone)从已打开文件对象中读取序列化后的对象重建其中特定对象的层次结构并返回。pickle 协议版本是自动检测出来的所以不需要参数来指定协议。封存对象以外的其他字节将被忽略。loads 方法pickle.loads(data, /, *, fix_importsTrue, encodingASCII, errorsstrict, buffersNone)重建并返回 data 的对象层级结构。data 是序列化后的 bytes 对象。 3 示例代码 首先来看看序列化的过程分别将字符串、字典和列表进行序列化使用 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.comIn [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 objectIn [7]: pickle.dump(aDict, f, True)
IPython.core.display.Javascript objectIn [8]: pickle.dump(aList, f, True)
IPython.core.display.Javascript objectIn [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 objectIn [13]: pickle.dump(aDict, f, True)
IPython.core.display.Javascript objectIn [14]: pickle.dump(aList, f, True)
IPython.core.display.Javascript objectIn [15]: f.close()In [16]: f1 open(test.pkl, rb)In [17]: lString pickle.load(f1)
IPython.core.display.Javascript objectIn [18]: lString
Out[18]: xugaoxiang.comIn [19]: lDict pickle.load(f1)
IPython.core.display.Javascript objectIn [20]: lDict
Out[20]: {p: python, r: rust, s: swift}In [21]: lList pickle.load(f1)
IPython.core.display.Javascript objectIn [22]: lList
Out[22]: [one, two, three]In [23]: f1.close() 通过以上代码可以看到反序列化的过程跟序列化的顺序一样这一点跟数据结构中的队列很像。 4 文件对象不可以序列化 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 objectIn [34]: 5 可移植性 pickle 文件格式独立于机器的体系结构这也就意味着可以在 linux 下创建一个 pickle然后将它发送到在 Windows 或 MacOS 下运行的 Python 程序。而且当 python 版本升级时也不必担心已有的 pickle 操作出现问题可以向后兼容。 6 免费社群