Python3内置模块之Pickle和cPickle数据持久化方法小结

概述

模块Pickle实现了对一个 Python 对象结构的二进制的序列化和反序列化。  即当Python程序持续运行一些字符串、列表字典、甚至自定义的类等数据对象,须要持久化存储,即存储在磁盘中,防止运行在内存中,因断电等状况丢失数据。那么Pickle模块就派上用场了,它能够将对象转换为一种能够传输或存储的格式。python的pickle模块实现了基本的数据序列和反序列化。经过pickle模块的序列化操做咱们可以将程序中运行的对象信息保存到文件中去,永久存储;经过pickle模块的反序列化操做,咱们可以从文件中建立上一次程序保存的对象。python

与JSON模块的比较

能够看到pickle模块和看似类似,但其仍是有着本质的不一样,即:bash

  • JSON 是一个文本序列化格式(它输出 unicode 文本,尽管在大多数时候它会接着以 utf-8 编码),而 pickle 是一个二进制序列化格式;markdown

  • JSON是字面量可读的,而pickle不是(能够类比base64的不可读性);网络

  • JSON是可互操做的,在Python系统以外普遍使用,而pickle则是Python专用的;性能

序列化与反序列化

经过二进制的方式读写目标存储文件,并利用dump序列化数据对象,load反序列化数据对象ui

D = {
    'name': 'bob',
    'major': {
        'english',
        'math'
    },
    'd': [1, 2, 3, 4, 5, 6, 7]
}

with open('D.pik', 'wb') as f:
    pickle.dump(D, f)

with open('D.pik', 'rb') as f:
    D = pickle.load(f)
    print(type(D))
    print(D)
复制代码

示例结果:编码

<class 'dict'>
{'name': 'bob', 'major': {'english', 'math'}, 'd': [1, 2, 3, 4, 5, 6, 7]}
复制代码

固然咱们也能够序列化到内存(字符串格式保存),而后对象能够以任何方式处理如经过网络传输spa

pik = pickle.dumps(D)
print(pik)

D = pickle.loads(pik)
print(type(D))
print(D)
复制代码

示例结果:code

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00bobq\x02X\x05\x00\x00\x00majorq\x03cbuiltins\nset\nq\x04]q\x05(X\x07\x00\x00\x00englishq\x06X\x04\x00\x00\x00mathq\x07e\x85q\x08Rq\tX\x01\x00\x00\x00dq\n]q\x0b(K\x01K\x02K\x03K\x04K\x05K\x06K\x07eu.'
<class 'dict'>
{'name': 'bob', 'major': {'english', 'math'}, 'd': [1, 2, 3, 4, 5, 6, 7]}
复制代码

cPickle

cPickle包的功能和用法与pickle包几乎彻底相同 (其存在差异的地方实际上不多用到),不一样在于cPickle是基于c语言编写的,具备更好的性能,对于大多数应用程序,推荐使用该模块。对于上面的例子,若是想使用cPickle包,咱们均可以将import语句改成import cPickle as pickle进行使用。orm

相关文章
相关标签/搜索