Python 中 Pickle 庫的使用詳解


介紹

  pickle是python語言的一個標准模塊,安裝python后已包含pickle庫,不需要單獨再安裝。

  為什么需要序列化和反序列化這一操作呢?

  1.便於存儲。序列化過程將文本信息轉變為二進制數據流。這樣就信息就容易存儲在硬盤之中,當需要讀取文件的時候,從硬盤中讀取數據,然后再將其反序列化便可以得到原始的數據。在Python程序運行中得到了一些字符串、列表、字典等數據,想要長久的保存下來,方便以后使用,而不是簡單的放入內存中關機斷電就丟失數據。python模塊大全中的Pickle模塊就派上用場了,它可以將對象轉換為一種可以傳輸或存儲的格式。

  2.便於傳輸。當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個對象轉換為字節序列,在能在網絡上傳輸;接收方則需要把字節序列在恢復為對象。

  pickle 模塊是以二進制的形式序列化后保存到文件中(保存文件的后綴為”.pkl”),不能直接打開進行預覽。而python的另一個序列化標准模塊 json,則是 human-readable 的,可以直接打開查看(例如在notepad++中查看)。

  pickle 模塊有兩類主要的接口,即序列化和反序列化。

  序列化操作包括:

pickle.dump()
Pickler(file, protocol).dump(obj)

  反序列化操作包括:

pickle.load()
Unpickler(file).load()

2 序列化操作

2.1 序列化方法pickle.dump()

  序列化的方法為 pickle.dump(),該方法的相關參數如下:

pickle.dump(obj, file, protocol=None,*,fix_imports=True)

  該方法實現的是將序列化后的對象obj以二進制形式寫入文件file中,進行保存。它的功能等同於 Pickler(file, protocol).dump(obj)。

  關於參數 file,有一點需要注意,必須是以二進制的形式進行操作(寫入)。

  例如下:

import pickle with open('svm_model_iris.pkl', 'wb') as f: pickle.dump(svm_classifier, f)

  file 為'svm_model_iris.pkl',並且以二進制的形式('wb')寫入。

  關於參數 protocol,一共有 5 中不同的類型,即(0,1,2,3,4)。(0,1,2)對應的是 python 早期的版本,(3,4)則是在 python3 之后的版本。此外,參數可選 pickle.HIGHEST_PROTOCOL 和 pickle.DEFAULT_PROTOCOL。當前,python3.5 版本中,pickle.HIGHEST_PROTOCOL的值為 4,pickle.DEFAULT_PROTOCOL的值為3。當protocol參數為負數時,表示選擇的參數是pickle.HIGHEST_PROTOCOL。

2.2 序列化方法pickle.dumps()

  pickle.dumps()方法的參數如下:

pickle.dumps(obj, protocol=None,*,fix_imports=True)

2.3 序列化方法Pickler(file, protocol).dump(obj)

  pickle模塊提供了序列化的面向對象的類方法,即 class pickle.Pickler(file, protocol=None,*,fix_imports=True),Pickler類有dump()方法。

  Pickler(file, protocol).dump(obj) 實現的功能跟 pickle.dump()是一樣的。

  關於Pickler類的其他method,請參考官方API。

3 反序列化操作

3.1 反序列化方法pickle.load()

  序列化的方法為 pickle.load(),該方法的相關參數如下:

pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)

  參考前文的案例如下:

import pickle with open('svm_model_iris.pkl', 'rb') as f: model = pickle.load(f)

  file為'svm_model_iris.pkl',並且以二進制的形式('rb')讀取。

  讀取的時候,參數protocol是自動選擇的,load()方法中沒有這個參數。

3.2 反序列化方法pickle.loads()

  pickle.loads()方法的參數如下:

pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)

  pickle.loads()方法跟pickle.load()方法的區別在於,pickle.loads()方法是直接從bytes對象中讀取序列化的信息,而非從文件中讀取。

3.3 反序列化方法Unpickler(file).load()

  pickle模塊提供了反序列化的面向對象的類方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict"),Pickler類有load()方法。

  Unpickler(file).load() 實現的功能跟 pickle.load() 是一樣的。

  關於Unpickler類的其他method,請參考官方API。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM