在「通過簡單示例來理解什麼是機器學習」這篇文章裡提到了pickle庫的使用,本文來做進一步的闡述。
那麼為什麼需要序列化和反序列化這一操作呢?
便於儲存。序列化過程將文字資訊轉變為二進位制資料流。這樣就資訊就容易儲存在硬碟之中,當需要讀取檔案的時候,從硬碟中讀取資料,然後再將其反序列化便可以得到原始的資料。在python程式執行中得到了一些字串、列表、字典等資料,想要長久的儲存下來,方便以後使用,而不是簡單的放入記憶體中關機斷電就丟失資料。python模組大全中的pickle模組就派上用場了,它可以將物件轉換為一種可以傳輸或儲存的格式。
loads()函式執行和load() 函式一樣的反序列化。取代接受乙個流物件並去檔案讀取序列化後的資料,它接受包含序列化後的資料的str物件, 直接返回的物件。
**示例:
[python] view plain copy2.便於傳輸。當兩個程序在進行遠端通訊時,彼此可以傳送各種型別的資料。無論是何種型別的資料,都會以二進位制序列的形式在網路上傳送。傳送方需要把這個物件轉換為位元組序列,在能在網路上傳輸;接收方則需要把位元組序列在恢復為物件。#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cpickle as pickle
obj = 123, "abcdedf", ["ac", 123],
print obj# 輸出:(123, 'abcdedf', ['ac', 123], )
# 序列化到檔案
with open(r"d:\a.txt", "r+") as f:
pickle.dump(obj, f)
with open(r"d:\a.txt") as f:
print pickle.load(f)# 輸出:(123, 'abcdedf', ['ac', 123], )
# 序列化到記憶體(字串格式儲存),然後物件可以以任何方式處理如通過網路傳輸
obj1 = pickle.dumps(obj)
print type(obj1)# 輸出:print obj1# 輸出:python專用的儲存格式
obj2 = pickle.loads(obj1)
print type(obj2)# 輸出:print obj2# 輸出:(123, 'abcdedf', ['ac', 123], )
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模組有兩類主要的介面,即序列化和反序列化。
常採用這樣的方式使用:
[python] view plain copy其中序列化操作包括:import cpickle as pickle
pickle.dump(obj,f)
pickle.dumps(obj,f)
pickle.load(f)
pickle.loads(f)
pickle.dump()反序列化操作包括:
pickler(file, protocol).dump(obj)序列化的方法為
pickle.dump()
,該方法的相關引數如下:
pickle.dump(obj, file, protocol=none,*,fix_imports=true)
該方法實現的是將序列化後的物件obj以二進位制形式寫入檔案file中,進行儲存。它的功能等同於pickler(file, protocol).dump(obj)
。
關於引數file,有一點需要注意,必須是以二進位制的形式進行操作(寫入)。
參考前文的案例如下:
import picklewith open('svm_model_iris.pkl', 'wb') as f:file為』svm_model_iris.pkl』,並且以二進位制的形式(』wb』)寫入。pickle.dump(svm_classifier, f)
關於引數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。
序列化的方法為pickle.load()
,該方法的相關引數如下:
pickle.load(file, *,fix_imports=true, encoding=」ascii」. errors=」strict」)
該方法實現的是將序列化的物件從檔案file中讀取出來。它的功能等同於unpickler(file).load()
。
關於引數file,有一點需要注意,必須是以二進位制的形式進行操作(讀取)。
參考前文的案例如下:
import picklewith open('svm_model_iris.pkl', 'rb') as f:file為』svm_model_iris.pkl』,並且以二進位制的形式(』rb』)讀取。model = pickle.load(f)
讀取的時候,引數protocol是自動選擇的,load()方法中沒有這個引數。
pickle.loads()
方法的引數如下:
pickle.loads(bytes_object, *,fix_imports=true, encoding=」ascii」. errors=」strict」)
pickle.loads()
方法跟pickle.load()
方法的區別在於,pickle.loads()
方法是直接從bytes物件中讀取序列化的資訊,而非從檔案中讀取。
pickle模組提供了反序列化的物件導向的類方法,即class pickle.unpickler(file, *,fix_imports=true, encoding="ascii". errors="strict")
,pickler類有load()方法。
unpickler(file).load() 實現的功能跟 pickle.load() 是一樣的。
關於unpickler類的其他method,請參考官方api。
官方文件是這麼介紹的,這裡我就不進一步描述了。
Python 中 Pickle 庫的使用詳解
pickle是序列化和反序列化 那麼為什麼需要序列化和反序列化這一操作呢?1.便於儲存。序列化過程將文字資訊轉變為二進位制資料流。這樣就資訊就容易儲存在硬碟之中,當需要讀取檔案的時候,從硬碟中讀取資料,然後再將其反序列化便可以得到原始的資料。在python程式執行中得到了一些字串 列表 字典等資料,...
pickle庫的使用
pickle庫可以直接儲存資料結果和從pk檔案中讀取資料結構,相當於乙個很強大的全域性變數,特別是我在用框架之類的要讀取記憶陣列,但是因為框架會在程式之間頻繁的跳動,所有全域性變數會一直被初始化而不管用了,pickle庫就可以解決這個問題 將資料結構寫入檔案 with open d temp.pk ...
Pickle包的使用
想要將python程式執行中得到的字串 列表 字典等資料,長久的儲存下來,而不是簡單的放入記憶體中關機斷電就丟失資料。pickle模組就是專門用來完成此功能的模組,它可以將物件轉換為一種可以傳輸或儲存的格式。它實現了基本的資料序列和反序列化,通過pickle模組的序列化操作,我們能夠將程式中執行的物...