• Python对象序列化


    888e5dc27c22e78b86b72a7544280e53.png

    迷途小书童的 Note

    读完需要

    7

    分钟

    速读仅需 3 分钟

    大家好,我是迷途小书童!

    Python 开发中,我们经常需要将对象数据保存到磁盘,或者通过网络传输对象信息。这时就需要序列化,Pickle 库为我们提供了极为方便的对象序列化功能。本文将全面解析 Pickle 的工作机制、典型应用及示例代码,希望可以帮助初学者快速掌握这个实用的内置模块。

    1

       

    简介

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

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

    2

       

    常用方法

    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 对象。

    3

       

    示例代码

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

    1. (demo) PS C:\Users\Administrator> ipython
    2. Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
    3. Type 'copyright', 'credits' or 'license' for more information
    4. IPython 7.12.0 -- An enhanced Interactive Python. Type '?' for help.
    5. In [1]: aString = 'xugaoxiang.com'
    6. In [2]: aDict = {'p': 'python', 'r': 'rust', 's': 'swift'}
    7. In [3]: aList = ['one', 'two', 'three']
    8. In [5]: f = open('test.pkl', 'wb')
    9. In [6]: pickle.dump(aString, f, True)
    10. <IPython.core.display.Javascript object>
    11. In [7]: pickle.dump(aDict, f, True)
    12. <IPython.core.display.Javascript object>
    13. In [8]: pickle.dump(aList, f, True)
    14. <IPython.core.display.Javascript object>
    15. In [9]: f.close()
    16. In [10]:

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

    960509c8439eeba215032fc14a3e15de.png

    接下来开始反序列化

    1. In [11]: f = open('test.pkl', 'wb')
    2. In [12]: pickle.dump(aString, f, True)
    3. <IPython.core.display.Javascript object>
    4. In [13]: pickle.dump(aDict, f, True)
    5. <IPython.core.display.Javascript object>
    6. In [14]: pickle.dump(aList, f, True)
    7. <IPython.core.display.Javascript object>
    8. In [15]: f.close()
    9. In [16]: f1 = open('test.pkl', 'rb')
    10. In [17]: lString = pickle.load(f1)
    11. <IPython.core.display.Javascript object>
    12. In [18]: lString
    13. Out[18]: 'xugaoxiang.com'
    14. In [19]: lDict = pickle.load(f1)
    15. <IPython.core.display.Javascript object>
    16. In [20]: lDict
    17. Out[20]: {'p': 'python', 'r': 'rust', 's': 'swift'}
    18. In [21]: lList = pickle.load(f1)
    19. <IPython.core.display.Javascript object>
    20. In [22]: lList
    21. Out[22]: ['one', 'two', 'three']
    22. In [23]: f1.close()

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

    4

       

    文件对象不可以序列化

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

    1. In [32]: f = open('test.pkl', 'wb')
    2. <IPython.core.display.Javascript object>
    3. In [33]: p = pickle.dumps(f)
    4. <IPython.core.display.Javascript object>
    5. ---------------------------------------------------------------------------
    6. TypeError Traceback (most recent call last)
    7. 33-671076828a70> in <module>
    8. ----> 1 p = pickle.dumps(f)
    9. TypeError: cannot serialize '_io.BufferedWriter' object
    10. In [34]:

    5

       

    可移植性

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

    6

       

    免费社群

    66165f2f5b0a6a012818aaf9110d1940.jpeg

  • 相关阅读:
    CentOS 7.6上安装RabbitMQ
    卷积神经网络(CNN)
    2021年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
    oracle 执行计划查看常用sql
    Spring的启动扩展点机制详解
    analog IC layout-Environmental noise
    SSM - Springboot - MyBatis-Plus 全栈体系(二十三)
    PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!
    Transformer - model architecture
    cesium结构图
  • 原文地址:https://blog.csdn.net/djstavaV/article/details/132769845