Python庫:序列化和反序列化模塊pickle介紹
1 前言
在「通過簡單示例來理解什麼是機器學習」這篇文章里提到了pickle庫的使用,本文來做進一步的闡述。
- 通過簡單示例來理解什麼是機器學習
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++中查看)。
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。
關於參數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。
插播一條硬廣:技術文章轉發太多,本文來自微信公眾號:「Python數據之道」(ID:PyDataRoad)。
3 反序列化操作
3.1 反序列化方法pickle.load
序列化的方法為 pickle.load
,該方法的相關參數如下:
pickle.load(file, *,fix_imports=True, encoding=」ASCII」. errors=」strict」)
該方法實現的是將序列化的對象從文件file中讀取出來。它的功能等同於 Unpickler(file).load
。
關於參數file,有一點需要注意,必須是以二進位的形式進行操作(讀取)。
參考前文的案例如下:
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.loadspickle.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。
4 那些類型可以進行序列化和反序列化操作
官方文檔是這麼介紹的,這裡我就不進一步描述了。
寫在後面
pickle模塊還是比較實用的,當然,關於pickle模塊,其實還有許多的信息可以去了解,想了解更多信息的童鞋,建議可以閱讀下python官方的API文檔(library文件)。


※Java - 在WebService中使用Client調用三方的RestAPI
※數據應用達人之SQL基礎教程分享11-Scalar函數
※我的第一篇博文:C++新手村的復活點-致敬經典-小遊戲走迷宮
※Spring 極速集成註解 redis 實錄
※ASP.NET Core Web 資源打包與壓縮
TAG:科技優家 |
※NodeJS反序列化漏洞利用getshell
※Python編程:序列化和反序列化
※Hessian2ObjectInput.readObject : hessian 反序列化空指針異常
※Oracle WebLogic Server反序列化遠程代碼執行漏洞成焦點
※FastJson反序列化漏洞利用的三個細節-TemplatesImpl利用鏈
※Mozilla Rhino 反序列化漏洞 POC 分析
※使用RedisTemplate(JDK序列化策略)緩存實體類
※Weblogic反序列化命令執行漏洞
※利用fastjson反序列化json為對象和對象數組
※WebLogic WLS核心組件曝反序列化漏洞
※從微博motan看rpc基於netty4遠程通訊設計5-協議編解碼與序列化
※MapReduce數據序列化讀寫概念淺析!
※關於使用fastjson統一序列化響應格式
※通過小細節大幅改善 Django Rest 框架序列化性能
※Weblogic反序列化遠程代碼執行漏洞研究分析
※Go 中 JSON 的序列化和反序列化
※【Golang區塊鏈開發003】區塊序列化存儲
※CVE-2018-2628 Weblogic反序列化POC重構詳解
※千里眼可信主動免疫防護系統Weblogic反序列化漏洞防護方案
※用GDB調試PHP及反序列化小記