Python的pickle模块实现了Python对象与字节流之间的二进制转换协议。即Python的pickle模块提供了Python对象的序列化/反序列化功能。
- Pickling,即序列化,特指将Python对象转换为字节流的过程。
- Unpickling,即反序列化,特指将字节流转换为Python对象的过程。
1. Python的pickle模块的组成
- class PickleError(Exception)
- class PicklingError(PickleError)
- class UnpicklingError(PickleError)
- class _Pickler
_Pickler(self, file, protocol=None, *, fix_imports=True)
DEFAULT_PROTOCOL = 3
HIGHEST_PROTOCOL = 4
_Unpickler(self, file, *, fix_imports=True, encoding="ASCII", errors="strict")
- def _dump(obj, file, protocol=None, *, fix_imports=True)
- def _dumps(obj, protocol=None, *, fix_imports=True)
- def _load(file, *, fix_imports=True, encoding="ASCII", errors="strict")
- def _loads(s, *, fix_imports=True, encoding="ASCII", errors="strict")
2. pickle模块与marshal模块的对比
pickle模块常常用于Python应用的开发过程中,序列化Python对象。而marshal模块更底层些,仅用于序列化Python的.pyc文件。
pickle模块会保留其序列化过的所有Python对象的track,在再次需要序列化该Python对象时,可以直接给出序列化后的字节流,而无需再次进行序列化。而marshal模块不能省略再次序列化的过程,每次都执行序列化操作。
pickle模块可以序列化用户定义的类。而marshal模块只能序列化Python内置类型。
pickle模块的序列化能够兼容不同的Python版本。而marshal模块不能也没必要保证兼容性。
3. pickle模块与json模块的对比
pickle模块实现的二进制转换协议与json模块实现的JSON格式转换协议完全不同。
JSON格式是一个文本序列化格式。pickle字节流格式是一个二进制序列化格式。
JSON是人可读的,而pickle字节流无法供人阅读。
JSON多用于与外部其他系统的交互,而pickle字节流仅供Python内部读写。
JSON只能表示Python内置类型,而pickle字节流可以表示开发人员定制类型。
4.序列化示例
import pickle
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}
with open('mydata.pickle', 'wb') as myfile:
pickle.dump(data, myfile, pickle.HIGHEST_PROTOCOL)
5. 反序列化示例
import pickle
with open('mydata.pickle', 'rb') as myfile:
data = pickle.load(myfile)
参考链接:
https://docs.python.org/3.5/library/pickle.html
https://github.com/python/cpython/blob/3.5/Lib/pickle.py