08.14 python持久化模塊-pickle

python持久化模塊-pickle

在機器學習中,我們常常需要把訓練好的模型存儲起來,這樣在進行使用時直接將模型讀出,而不需要重新訓練模型,這樣就大大節約了時間。Python提供的pickle模塊就很好地解決了這個問題,使用它可以輕鬆序列化對象並保存到磁盤中,並在需要的時候讀取出來,任何對象都可以執行序列化操作

python持久化模塊-pickle

pickle提供了一個簡單的持久化功能。可以將對象以文件的形式存放在磁盤上。

有人不禁要問了,python已經提供了文件的讀寫功能了,為什麼還要pickle模塊呢?

其實python從一個文件中讀取字符串是非常簡單的,但是如果想要讀取出數值,那就有點不簡單了,python中日常讀取文件的方法比如read()或者readline()都是返回一個字符串類型,想要取出數值的話,可以使用int函數或者float函數把類似'123'或者'2.7'這樣的字符串強制轉換為數值類型,這樣就很麻煩了。

另外,保存文件,通過write方法寫入文件並保存的文件都是字符串的形式,如果你要保存類似列表,字典甚至是類的實例這樣的更為複雜的數據類型的時候,普通的文件操作就好像有點力不從心了。當然你也可以把這些都以字符串的形式保存在文件中,但是當你要使用它而去讀取的時候,從文件中回覆到原來的數據對象,就變得異常麻煩了!!!

Python提供的標準模塊-pickle就提供了這樣的功能,使用這個模塊,可以很方便的把列表,字典,或者類對象這類複雜數據類型存儲為文件,並且讀取的時候能從文件中回覆到原來的對象,而不丟失其身份和類型等信息。

另外,它存儲的文件類型也和一般的不一樣,是二進制文件,它幾乎可以把所有的python對象都傳化成二進制形式的文件,這個過程稱為pickling,從二進制轉換回對象的過程稱為unpickling。

pickle模塊有兩類主要的接口,即序列化(dump)和反序列化(load)

序列化方法pickle.dump()

ickle.dump(obj, file, protocol=None,*,fix_imports=True)

該方法實現的是將序列化後的對象obj以二進制形式寫入文件file中,進行保存。關於參數file,有一點需要注意,必須是以二進制的形式進行操作(寫入),如下圖:

python持久化模塊-pickle

把這個列表保存起來,一定要以二進制的文件形式打開文件,這裡的後綴名可以是隨意的,不一定非要是'pkl',但是使用的是pickle保存的,為了方便識別,建議直接使用'.pkl'文件格式。完成後記得把打開的文件關閉(close),這個和普通的文本文件一樣。

在當前目錄下就生成了一個data.pkl文件,打開之後是亂碼(因為這是二進制文件),如下圖:

python持久化模塊-pickle

反序列化方法pickle.load()

該方法的相關參數如下:

pickle.load(file, *,fix_imports=True, encoding="ASCII". errors="strict")

該方法實現的是將序列化的對象從文件file中讀取出來,關於參數file,有一點需要注意,必須是以二進制的形式進行操作(讀取)

python持久化模塊-pickle

可以直接獲取我們的列表了,如下圖:

python持久化模塊-pickle

如果是天氣或者地圖座標文件,使用這個模塊簡直不要太方便。

Pickle模塊可以保持任何你能想到的東西!!

序列化反序列化的衍生方法

序列化方法pickle.dumps()

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

pickle.dumps()方法跟pickle.dump()方法的區別在於,pickle.dumps()方法不需要寫入文件中,它是直接返回一個序列化的bytes對象。

反序列化方法pickle.loads()

pickle.loads(bytes_object, *,fix_imports=True, encoding="ASCII". errors="strict")

pickle.loads()方法跟pickle.load()方法的區別在於,pickle.loads()方法是直接從bytes對象中讀取序列化的信息,而非從文件中讀取。

為什麼使用二進制文件格式?

便於存儲。序列化過程將文本信息轉變為二進制數據流。這樣就信息就容易存儲在硬盤之中,當需要讀取文件的時候,從硬盤中讀取數據,然後再將其反序列化便可以得到原始的數據。

便於傳輸。當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個對象轉換為字節序列,在能在網絡上傳輸;接收方則需要把字節序列在恢復為對象。

cPickle包

cPickle包的功能和用法與pickle包幾乎完全相同 (其存在差別的地方實際上很少用到),不同在於cPickle是基於c語言編寫的,速度是pickle包的1000倍,它具有更好的性能,對於大多數應用程序,推薦使用該模塊。如果想使用cPickle包,我們都可以直接這樣使用:import cPickle as pickle就可以了。


分享到:


相關文章: