首頁(yè)技術(shù)文章正文

Pickle模塊的使用

更新時(shí)間:2018-11-26 來(lái)源:黑馬程序員 瀏覽量:

  1.Pickle的介紹

  pickle是python語(yǔ)言的一個(gè)標(biāo)準(zhǔn)模塊,安裝python后已包含pickle庫(kù),不需要單獨(dú)再安裝

  序列化和反序列化作用

  1.便于存儲(chǔ)。序列化過(guò)程將文本信息轉(zhuǎn)變?yōu)槎M(jìn)制數(shù)據(jù)流。這樣就信息就容易存儲(chǔ)在硬盤之中,當(dāng)需要讀取文件的時(shí)候,從硬盤中讀取數(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ā)送各種類型的數(shù)據(jù)。無(wú)論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。發(fā)送方需要把這個(gè)對(duì)象轉(zhuǎn)換為字節(jié)序列,在能在網(wǎng)絡(luò)上傳輸;接收方則需要把字節(jié)序列在恢復(fù)為對(duì)象。

  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)制形式寫入文件file中,進(jìn)行保存。它的功能等同于 Pickler(file, protocol).dump(obj)。

  關(guān)于參數(shù)file,有一點(diǎn)需要注意,必須是以二進(jìn)制的形式進(jìn)行操作(寫入)。

  參考前文的案例如下:

  import picklewith open('svm_model_iris.pkl', 'wb') as f:

  pickle.dump(svm_classifier, f)

  file為'svm_model_iris.pkl',并且以二進(jìn)制的形式('wb')寫入。

  關(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。

  2.2 序列化方法pickle.dumps()

  pickle.dumps()方法的參數(shù)如下:

  pickle.dumps(obj, protocol=None,*,fix_imports=True)

  pickle.dumps()方法跟pickle.dump()方法的區(qū)別在于,pickle.dumps()方法不需要寫入文件中,它是直接返回一個(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 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ū)ο蟮念惙椒?,?class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict"),Pickler類有l(wèi)oad()方法。

  Unpickler(file).load() 實(shí)現(xiàn)的功能跟 pickle.load() 是一樣的。



作者:傳智播人工智能+Python培訓(xùn)學(xué)院

首發(fā): http://python.itheima.com

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!