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。