在「經過簡單示例來理解什麼是機器學習」這篇文章裏提到了pickle庫的使用,本文來作進一步的闡述。python
pickle是python語言的一個標準模塊,安裝python後已包含pickle庫,不須要單獨再安裝。
pickle模塊實現了基本的數據序列化和反序列化。經過pickle模塊的序列化操做咱們可以將程序中運行的對象信息保存到文件中去,永久存儲;經過pickle模塊的反序列化操做,咱們可以從文件中建立上一次程序保存的對象。
在官方的介紹中,序列化操做的英文描述有好幾個單詞,如」serializing」, 「pickling」, 「serialization」, 「marshalling」 或者」flattening」等,它們都表明的是序列化的意思。相應的,反序列化操做的英文單詞也有好多個,如」de-serializing」, 「unpickling」, 「deserailization」等。爲了不混淆,通常用」pickling」/「unpickling」, 或者」serialization」/「deserailization」。pickle
模塊是以二進制的形式序列化後保存到文件中(保存文件的後綴爲」.pkl」),不能直接打開進行預覽。而python的另外一個序列化標準模塊json
,則是human-readable的,能夠直接打開查看(例如在notepad++中查看)。json
pickle模塊有兩類主要的接口,即序列化和反序列化。
其中序列化操做包括:微信
pickle.dump()
Pickler(file, protocol).dump(obj)
pickle.load()
Unpickler(file).load()
序列化的方法爲 pickle.dump()
,該方法的相關參數以下:
pickle.dump(obj, file, protocol=None,*,fix_imports=True)
該方法實現的是將序列化後的對象obj以二進制形式寫入文件file中,進行保存。它的功能等同於 Pickler(file, protocol).dump(obj)
。
關於參數file,有一點須要注意,必須是以二進制的形式進行操做(寫入)。
參考前文的案例以下:markdown
import pickle
with open('svm_model_iris.pkl', 'wb') as f:
pickle.dump(svm_classifier, f)
file爲’svm_model_iris.pkl’,而且以二進制的形式(’wb’)寫入。app
關於參數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。
關於參數protocol,官方的詳細介紹以下:機器學習
pickle.dumps()
方法的參數以下:
pickle.dumps(obj, protocol=None,*,fix_imports=True)pickle.dumps()
方法跟pickle.dump()
方法的區別在於,pickle.dumps()
方法不須要寫入文件中,它是直接返回一個序列化的bytes對象。學習
pickle模塊提供了序列化的面向對象的類方法,即 class pickle.Pickler(file, protocol=None,*,fix_imports=True)
,Pickler類有dump()方法。
Pickler(file, protocol).dump(obj) 實現的功能跟 pickle.dump() 是同樣的。
關於Pickler類的其餘method,請參考官方API。ui
插播一條硬廣:技術文章轉發太多,本文來自微信公衆號:「Python數據之道」(ID:PyDataRoad)。lua
序列化的方法爲 pickle.load()
,該方法的相關參數以下:
pickle.load(file, *,fix_imports=True, encoding=」ASCII」. errors=」strict」)
該方法實現的是將序列化的對象從文件file中讀取出來。它的功能等同於 Unpickler(file).load()
。
關於參數file,有一點須要注意,必須是以二進制的形式進行操做(讀取)。
參考前文的案例以下:url
import pickle
with open('svm_model_iris.pkl', 'rb') as f:
model = pickle.load(f)
file爲’svm_model_iris.pkl’,而且以二進制的形式(’rb’)讀取。
讀取的時候,參數protocol是自動選擇的,load()方法中沒有這個參數。
pickle.loads()
方法的參數以下:
pickle.loads(bytes_object, *,fix_imports=True, encoding=」ASCII」. errors=」strict」)pickle.loads()
方法跟pickle.load()
方法的區別在於,pickle.loads()
方法是直接從bytes對象中讀取序列化的信息,而非從文件中讀取。
pickle模塊提供了反序列化的面向對象的類方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict")
,Pickler類有load()方法。
Unpickler(file).load() 實現的功能跟 pickle.load() 是同樣的。
關於Unpickler類的其餘method,請參考官方API。
官方文檔是這麼介紹的,這裏我就不進一步描述了。
pickle模塊仍是比較實用的,固然,關於pickle模塊,其實還有許多的信息能夠去了解,想了解更多信息的童鞋,建議能夠閱讀下python官方的API文檔(library文件)。