Python中pickle序列化与反序列化

原文地址

  • 序列化/反序列化

    将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化;反之,则称为反序列化

  • pickle

    pickle模块实现了用于对Python对象结构进行 序列化 和 反序列化 的二进制协议,与json模块不同的是pickle模块序列化和反序列化的过程分别叫做 pickling 和 unpickling:

    • pickling: 是将Python对象转换为字节流的过程;
    • unpickling: 是将字节流二进制文件或字节对象转换回Python对象的过程
  • 使用示例

    • 导入模块

      import pickle
      
    • 生成测试数据

      obj = {1:'a', 2:'b'}
      
    • 序列化——dumps

      将指定的Python对象通过pickle序列化作为bytes对象返回

      pickleobj = pickle.dumps(obj)
      # b'\x80\x03}q\x00(K\x01X\x01\x00\x00\x00aq\x01K\x02X\x01\x00\x00\x00bq\x02u.'
      
    • 反序列化——loads

      将通过pickle序列化后得到的字节对象进行反序列化,转换为Python对象并返回

      reobj = pickle.loads(pickleobj)
      # {1: 'a', 2: 'b'}
      
    • 序列化——dump

      将指定的Python对象通过pickle序列化后写入打开的文件对象中,等价于Pickler(file, protocol).dump(obj)

      注意与上面dumps的区别

      with open('../data/pickle.txt', 'wb') as f:
          pickle.dump(obj, f)
      with open('../data/pickle.data', 'wb') as f:	# 可以自己指定后缀
          pickle.dump(obj, f)
      
    • 反序列化——load

      从打开的文件对象中读取pickled对象表现形式并返回通过pickle反序列化后得到的Python对象

      with open('../data/pickle.txt', 'rb') as f:
          res1 = pickle.load(f)
      print(type(res1))   # <class 'dict'>
      print(res1)         # {1: 'a', 2: 'b'}
      with open('../data/pickle.data', 'rb') as f:
          res2 = pickle.load(f)
      print(type(res2))   # <class 'dict'>
      print(res2)         # {1: 'a', 2: 'b'}
      
  • 参考文献

    Python之数据序列化(json、pickle、shelve)

发布了159 篇原创文章 · 获赞 169 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/BBJG_001/article/details/104767667