Python3內建模組之Pickle和cPickle資料持久化方法小結

dav2100發表於2021-09-09

概述

模組Pickle實現了對一個 Python 物件結構的二進位制的序列化和反序列化。  即當Python程式持續執行一些字串、列表字典、甚至自定義的類等資料物件,需要持久化儲存,即儲存在磁碟中,防止執行在記憶體中,因斷電等情況丟失資料。那麼Pickle模組就派上用場了,它可以將物件轉換為一種可以傳輸或儲存的格式。python的pickle模組實現了基本的資料序列和反序列化。透過pickle模組的序列化操作我們能夠將程式中執行的物件資訊儲存到檔案中去,永久儲存;透過pickle模組的反序列化操作,我們能夠從檔案中建立上一次程式儲存的物件。

與JSON模組的比較

可以看到pickle模組和看似相似,但其還是有著本質的不同,即:

  • JSON 是一個文字序列化格式(它輸出 unicode 文字,儘管在大多數時候它會接著以 utf-8 編碼),而 pickle 是一個二進位制序列化格式;

  • JSON是字面量可讀的,而pickle不是(可以類比base64的不可讀性);

  • JSON是可互操作的,在Python系統之外廣泛使用,而pickle則是Python專用的;

序列化與反序列化

透過二進位制的方式讀寫目標儲存檔案,並利用dump序列化資料物件,load反序列化資料物件

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]}

當然我們也可以序列化到記憶體(字串格式儲存),然後物件可以以任何方式處理如透過網路傳輸


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

D = pickle.loads(pik)
print(type(D))
print(D)

示例結果:

b'x80x03}qx00(Xx04x00x00x00nameqx01Xx03x00x00x00bobqx02Xx05x00x00x00majorqx03cbuiltinsnsetnqx04]qx05(Xx07x00x00x00englishqx06Xx04x00x00x00mathqx07ex85qx08RqtXx01x00x00x00dqn]qx0b(Kx01Kx02Kx03Kx04Kx05Kx06Kx07eu.'
<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進行使用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4479/viewspace-2823019/,如需轉載,請註明出處,否則將追究法律責任。

相關文章