1 前言
在“通過(guò)簡(jiǎn)單示例來(lái)理解什么是機(jī)器學(xué)習(xí)”這篇文章里提到了pickle庫(kù)的使用晦攒,本文來(lái)做進(jìn)一步的闡述纠脾。
pickle是python語(yǔ)言的一個(gè)標(biāo)準(zhǔn)模塊巩螃,安裝python后已包含pickle庫(kù)璧针,不需要單獨(dú)再安裝。
pickle模塊實(shí)現(xiàn)了基本的數(shù)據(jù)序列化和反序列化十厢。通過(guò)pickle模塊的序列化操作我們能夠?qū)⒊绦蛑羞\(yùn)行的對(duì)象信息保存到文件中去等太,永久存儲(chǔ);通過(guò)pickle模塊的反序列化操作蛮放,我們能夠從文件中創(chuàng)建上一次程序保存的對(duì)象缩抡。
在官方的介紹中,序列化操作的英文描述有好幾個(gè)單詞包颁,如"serializing", "pickling", "serialization", "marshalling" 或者"flattening"等瞻想,它們都代表的是序列化的意思压真。相應(yīng)的,反序列化操作的英文單詞也有好多個(gè)蘑险,如"de-serializing", "unpickling", "deserailization"等滴肿。為了避免混淆,一般用"pickling"/"unpickling", 或者"serialization"/"deserailization"佃迄。
pickle
模塊是以二進(jìn)制的形式序列化后保存到文件中(保存文件的后綴為".pkl")泼差,不能直接打開(kāi)進(jìn)行預(yù)覽。而python的另一個(gè)序列化標(biāo)準(zhǔn)模塊json
呵俏,則是human-readable的堆缘,可以直接打開(kāi)查看(例如在notepad++中查看)。
pickle模塊有兩類主要的接口柴信,即序列化和反序列化套啤。
其中序列化操作包括:
pickle.dump()
Pickler(file, protocol).dump(obj)
反序列化操作包括:
pickle.load()
Unpickler(file).load()
2 序列化操作
2.1 序列化方法pickle.dump()
序列化的方法為 pickle.dump()
宽气,該方法的相關(guān)參數(shù)如下:
pickle.dump(obj, file, protocol=None,*,fix_imports=True)
該方法實(shí)現(xiàn)的是將序列化后的對(duì)象obj以二進(jìn)制形式寫(xiě)入文件file中随常,進(jìn)行保存。它的功能等同于 Pickler(file, protocol).dump(obj)
萄涯。
關(guān)于參數(shù)file绪氛,有一點(diǎn)需要注意,必須是以二進(jìn)制的形式進(jìn)行操作(寫(xiě)入)涝影。
參考前文的案例如下:
import pickle
with open('svm_model_iris.pkl', 'wb') as f:
pickle.dump(svm_classifier, f)
file為'svm_model_iris.pkl'枣察,并且以二進(jìn)制的形式('wb')寫(xiě)入。
關(guān)于參數(shù)protocol燃逻,一共有5中不同的類型序目,即(0,1,2,3,4)。(0,1,2)對(duì)應(yīng)的是python早期的版本伯襟,(3,4)則是在python3之后的版本猿涨。
此外,參數(shù)可選 pickle.HIGHEST_PROTOCOL和pickle.DEFAULT_PROTOCOL姆怪。當(dāng)前叛赚,python3.5版本中,pickle.HIGHEST_PROTOCOL的值為4稽揭,pickle.DEFAULT_PROTOCOL的值為3俺附。當(dāng)protocol參數(shù)為負(fù)數(shù)時(shí),表示選擇的參數(shù)是pickle.HIGHEST_PROTOCOL溪掀。
關(guān)于參數(shù)protocol事镣,官方的詳細(xì)介紹如下:
2.2 序列化方法pickle.dumps()
pickle.dumps()
方法的參數(shù)如下:
pickle.dumps(obj, protocol=None,*,fix_imports=True)
pickle.dumps()
方法跟pickle.dump()
方法的區(qū)別在于,pickle.dumps()
方法不需要寫(xiě)入文件中揪胃,它是直接返回一個(gè)序列化的bytes對(duì)象璃哟。
2.3 序列化方法Pickler(file, protocol).dump(obj)
pickle模塊提供了序列化的面向?qū)ο蟮念惙椒ㄟ肱眩?class pickle.Pickler(file, protocol=None,*,fix_imports=True)
,Pickler類有dump()方法。
Pickler(file, protocol).dump(obj) 實(shí)現(xiàn)的功能跟 pickle.dump() 是一樣的沮稚。
關(guān)于Pickler類的其他method艺沼,請(qǐng)參考官方API。
3 反序列化操作
3.1 反序列化方法pickle.load()
序列化的方法為 pickle.load()
蕴掏,該方法的相關(guān)參數(shù)如下:
pickle.load(file, *,fix_imports=True, encoding="ASCII". errors="strict")
該方法實(shí)現(xiàn)的是將序列化的對(duì)象從文件file中讀取出來(lái)障般。它的功能等同于 Unpickler(file).load()
。
關(guān)于參數(shù)file盛杰,有一點(diǎn)需要注意挽荡,必須是以二進(jìn)制的形式進(jìn)行操作(讀取)即供。
參考前文的案例如下:
import pickle
with open('svm_model_iris.pkl', 'rb') as f:
model = pickle.load(f)
file為'svm_model_iris.pkl'定拟,并且以二進(jìn)制的形式('rb')讀取。
讀取的時(shí)候逗嫡,參數(shù)protocol是自動(dòng)選擇的青自,load()方法中沒(méi)有這個(gè)參數(shù)。
3.2 反序列化方法pickle.loads()
pickle.loads()
方法的參數(shù)如下:
pickle.loads(bytes_object, *,fix_imports=True, encoding="ASCII". errors="strict")
pickle.loads()
方法跟pickle.load()
方法的區(qū)別在于驱证,pickle.loads()
方法是直接從bytes對(duì)象中讀取序列化的信息延窜,而非從文件中讀取。
3.3 反序列化方法Unpickler(file).load()
pickle模塊提供了反序列化的面向?qū)ο蟮念惙椒ǔ?class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict")
,Pickler類有l(wèi)oad()方法逆瑞。
Unpickler(file).load() 實(shí)現(xiàn)的功能跟 pickle.load() 是一樣的。
關(guān)于Unpickler類的其他method伙单,請(qǐng)參考官方API获高。
4 那些類型可以進(jìn)行序列化和反序列化操作
官方文檔是這么介紹的,這里我就不進(jìn)一步描述了吻育。
寫(xiě)在后面
pickle模塊還是比較實(shí)用的念秧,當(dāng)然,關(guān)于pickle模塊扫沼,其實(shí)還有許多的信息可以去了解出爹,想了解更多信息的童鞋,建議可以閱讀下python官方的API文檔(library文件)缎除。
由于個(gè)人精力有限严就,簡(jiǎn)書(shū)上文章更新較慢,實(shí)在抱歉器罐。歡迎關(guān)注微信公眾號(hào)(ID:PyDataRoad)