在“通過(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ǔ)在硬盤之中,當(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ì)象。
通過(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”),不能直接打開進(jìn)行預(yù)覽。而python的另一個(gè)序列化標(biāo)準(zhǔn)模塊json,則是human-readable的,可以直接打開查看(例如在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)行操作(寫入)。
新聞熱點(diǎn)
疑難解答
圖片精選