Python中的序列化-pickle

使用 pickle 来序列化对象

在 Java 中接触到对象序列化的概念,其实在 Python 中也有将对象序列化的方法,pickle 模块就是常用的方式之一。

其中就包括两个主要操作 序列化 和 反序列化,在 pickle 的官方文档中,它们对应的称呼是 pickling 和 unpickling

1Pickling (and unpickling) is alternatively known as “serialization”, “marshalling,” [1] or “flattening”; 
2however, to avoid confusion, the terms used here are “pickling” and “unpickling”.

  • pickling: pickling 过程就是把 Python 对象转化成字节流的过程。
    pickling 对应的方法是 dumps() 和 dump()
  • unpickling: 相反, unpickling 过程就是把字节流转化回 Python 对象的过程。
    unpickling 操作对应的方法是 loads() 和 load()

基本参数

1dumps(obj)  #将Python对象 obj 序列化为字节对象返回
2
3loads(bytes_object)  #将字节对象反序列化成Python对象返回
4
5dump(obj, file)  #将Python对象序列化为字节对象并保存至文件 file 中
6
7load(file)  #从文件 file 中读取字节对象并转化为Python对象返回

dumps 和 loads 基本用法

1>>> import pickle
2>>> test_obj = {'test_key0':111'test_key1':'value'}  #构建一个字典对象
3>>> test_byte = pickle.dumps(test_obj)  #将字典对象序列化
4>>> test_byte  #序列化结果
5b'\x80\x03}q\x00(X\t\x00\x00\x00test_key0q\x01KoX\t\x00\x00\x00test_key1q\x02X\x05\x00\x00\x00valueq\x03u.'
6>>> test_obj_restore = pickle.loads(test_byte)  #将字节对象反序列化
7>>> test_obj_restore  #反序列化结果
8{'test_key0'111'test_key1''value'}
9>>> 

dump 和 load 基本用法

 1>>> import pickle
2>>> test_obj = {'test_key0':111'test_key1':'value'}  #同样是构建一个普通字典对象
3>>> with open('pickle.pkl''wb'as fp:  #以二进制写的方式打开文件 pickle.pkl
4...     pickle.dump(test_obj, fp)  #将Python对象转化为字节对象写入文件中
5... 
6>>> with open('pickle.pkl''rb'as fp:  #以二进制读的方式打开文件 pickle.pkl
7...     test_obj_restore = pickle.load(fp)  #从文件中读取字节对象转化为Python对象保存在 test_obj_restore 中
8... 
9>>> test_obj_restore  #查看读取的结果
10{'test_key0'111'test_key1''value'}
11>>> 
12

需要注意的是

  • dumps 和 loads 是直接将转化结果返回,有返回值;而 dump 是将转化结果写入文件,所以是没有返回值的。
  • 我运行上面代码使用的 pickle 是 Python3 版本的。Python2 版本的 dumps 方法返回的是字符串形式。 Python2 中的 dump 和 load 方法允许文件以 文本 模式打开,而在 Python3 中将强制要求以二进制形式打开。
  • Python2 中有 cPickle 模块,它是 pickle 的 C 语言实现。如果要在 Python3 中使用 cPickle,需要使用
1import _pickle # or: import _pickle as  cPickle