Python 中Pickle庫(kù)的使用詳解
在“通過(guò)簡(jiǎn)單示例來(lái)理解什么是機(jī)器學(xué)習(xí)”這篇文章里提到了pickle庫(kù)的使用,本文來(lái)做進(jìn)一步的闡述。
那么為什么需要序列化和反序列化這一操作呢?
1.便于存儲(chǔ)。序列化過(guò)程將文本信息轉(zhuǎn)變?yōu)槎M(jìn)制數(shù)據(jù)流。這樣就信息就容易存儲(chǔ)在硬盤(pán)之中,當(dāng)需要讀取文件的時(shí)候,從硬盤(pán)中讀取數(shù)據(jù),然后再將其反序列化便可以得到原始的數(shù)據(jù)。在Python程序運(yùn)行中得到了一些字符串、列表、字典等數(shù)據(jù),想要長(zhǎng)久的保存下來(lái),方便以后使用,而不是簡(jiǎn)單的放入內(nèi)存中關(guān)機(jī)斷電就丟失數(shù)據(jù)。python模塊大全中的Pickle模塊就派上用場(chǎng)了,它可以將對(duì)象轉(zhuǎn)換為一種可以傳輸或存儲(chǔ)的格式。
2.便于傳輸。當(dāng)兩個(gè)進(jìn)程在進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類(lèi)型的數(shù)據(jù)。無(wú)論是何種類(lèi)型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)對(duì)象轉(zhuǎn)換為字節(jié)序列,在能在網(wǎng)絡(luò)上傳輸;接收方則需要把字節(jié)序列在恢復(fù)為對(duì)象。
通過(guò)簡(jiǎn)單示例來(lái)理解什么是機(jī)器學(xué)習(xí)
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模塊有兩類(lèi)主要的接口,即序列化和反序列化。
其中序列化操作包括:
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 picklewith 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中不同的類(lèi)型,即(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ū)ο蟮念?lèi)方法,即 class pickle.Pickler(file, protocol=None,*,fix_imports=True),Pickler類(lèi)有dump()方法。
Pickler(file, protocol).dump(obj)
實(shí)現(xiàn)的功能跟 pickle.dump()
是一樣的。
關(guān)于Pickler類(lèi)的其他method,請(qǐng)參考官方API。
插播一條硬廣:技術(shù)文章轉(zhuǎn)發(fā)太多,本文來(lái)自微信公眾號(hào):“Python數(shù)據(jù)之道”(ID:PyDataRoad)。
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)行操作(讀?。?/p>
參考前文的案例如下:
import picklewith 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ū)ο蟮念?lèi)方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict"),Pickler類(lèi)有l(wèi)oad()方法。
Unpickler(file).load() 實(shí)現(xiàn)的功能跟 pickle.load() 是一樣的。
關(guān)于Unpickler類(lèi)的其他method,請(qǐng)參考官方API。
4 那些類(lèi)型可以進(jìn)行序列化和反序列化操作
官方文檔是這么介紹的,這里我就不進(jìn)一步描述了。
寫(xiě)在后面
pickle模塊還是比較實(shí)用的,當(dāng)然,關(guān)于pickle模塊,其實(shí)還有許多的信息可以去了解,想了解更多信息的童鞋,建議可以閱讀下python官方的API文檔(library文件)。
以上所述是小編給大家介紹的Python 中Pickle庫(kù)的使用詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Python 通過(guò)分隔符分割文件后按特定次序重新組合的操作
這篇文章主要介紹了Python 通過(guò)分隔符分割文件后按特定次序重新組合的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04啟動(dòng)Atom并運(yùn)行python文件的步驟
在本篇文章中我們給大家分享了啟動(dòng)Atom并運(yùn)行python文件的步驟以及具體做法,需要的朋友們參考下。2018-11-11python中單下劃線與雙下劃線的區(qū)別及說(shuō)明
這篇文章主要介紹了python中單下劃線與雙下劃線的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2023-04-04python面向?qū)ο蟀鎸W(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python面向?qū)ο蟀鎸W(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06Python中base64與xml取值結(jié)合問(wèn)題
這篇文章主要介紹了Python中base64與xml取值結(jié)合問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12一篇文章徹底搞懂Python魔法參數(shù)args和kwargs(通俗易懂)
這篇文章主要介紹了Python中的*args和**kwargs,它們分別是可變位置參數(shù)和可變關(guān)鍵字參數(shù),文章通過(guò)實(shí)際例子展示了如何在函數(shù)、裝飾器等場(chǎng)景中使用*args和**kwargs,幫助讀者理解并掌握這些靈活的參數(shù)處理方式,需要的朋友可以參考下2025-02-02Python 開(kāi)發(fā)工具通過(guò) agent 代理使用的方法
這篇文章主要介紹了Python 開(kāi)發(fā)工具通過(guò) agent 代理使用的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09