在 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