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

相關文章
相關標籤/搜索