python 模块之pickle

地址

pickle 模块可以看作是cPickle 的python实现,cPick效率肯定比pickle快的多。但是cPick是一些函数块,并不是类,所以不能被子类化。大多数情况下不需要cPickle。 两者的模块接口几乎都一样!

python 包含一个更原始的序列化模块marshal ,但是我们经常需要用pickle来序列化对象。marshal 主要用于支持.pyc文件

pickle 和python 主要区别

1.pickle 模块会跟踪已经被序列化的对象,以便稍后对同一对象的引用不再被序列化,marshal 则不是!

    这对于递归对象和对象共享都有影响。递归对象包含对自身的引用的对象,marshal 不会处理这些,所以传递归对象会使python解释器崩溃!我们实际对同一对象多次引用序列化时,pickle 只会存储一次,并且确保所有引用指向主副本,共享保持对象,这对于可变对象来说很实用

2.marshal 不能用于序列化用户定义的类及其实例。pickle可以透明的保存和恢复类的实例。前提是类定义必须是可导入的,并且存储在和该对象相同的模块中。

3.marshal序列化格式是不能保证整个Python版本移植。由于其主要的工作是支持.pyc文件,Python实现者保留在需要时以非向后兼容的方式更改序列化格式的权利。pickle序列化格式是保证不同的Python版本向后兼容。

pickle 保存的格式目前分3种

1.protocol 协议 值为True 时是存储ASCII格式,向后兼容早期python版本

2.protocol 协议值为False 时是存储为二进制格式,兼容早期python版本

3.没研究明白 -_-!

用法

1.写入读取文件

pickle.dump(obj,file,protocol) 

obj 所要存储的对象

file pickle 形势打开的对象文件 open('fileName','w/r')

protocol 就是上面所说的三种格式

pickle.load(file)

2.直接以特定格式返回

pickle.dumps(obj,protocol)


3.那些类可以进行pickle持久化

1.None、True、False

2.整形、长整形、浮点数、复数

3.字符串和unicode 字符串

4.元组、列表、集合、可选对象的字典

5.在模块顶层定义的功能、内置函数、类

6.这些类的实例__dict__或其调用结果__getstate__()是可选的

你可能感兴趣的:(python 模块之pickle)