pickle模塊是以二進制的形式序列化後保存到文件中(保存文件的後綴爲”.pkl”),不能直接打開進行預覽。而python的另一個序列化標準模塊json,則是human-readable的,可以直接打開查看(例如在notepad++中查看)。
import pickle
a = {'name':'Tom','age':22}
with open('text.txt','wb') as file:
pickle.dump(a,file)
with open('text.txt','rb') as file2:
b = pickle.load(file2)
print(type(b))
舉個例子:
一個字典a = {'name':'Tom','age':22},用pickle.dump存到本地文件,所存數據的結構就是字典,而普通的file.write寫入文件的是字符串。讀取時,pickle.load返回的是一個字典,file.read返回的是一個字符串。得到的b的類型是字典,b和a是等價的,也就是說pickle可以把字典、列表等結構化數據存到本地文件,讀取後返回的還是字典、列表等結構化數據。而file.write、file.read存取的對象是字符串。
1.1 序列化方法pickle.dump()
序列化的方法爲 pickle.dump(),
該方法的相關參數如下:
pickle.dump(obj, file, protocol=None,*,fix_imports=True)
該方法實現的是將序列化後的對象obj以二進制形式寫入文件file中,進行保存。它的功能等同於 Pickler(file, protocol).dump(obj)。
關於參數file,有一點需要注意,必須是以二進制的形式進行操作(寫入)。
參考前文的案例如下:
import pickle
with open('svm_model_iris.pkl', 'wb') as f:
pickle.dump(svm_classifier, f)
file爲'svm_model_iris.pkl'
,並且以二進制的形式('wb')寫入。
關於參數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。
1.2序列化方法pickle.dumps()
pickle.dumps()方法的參數如下:
pickle.dumps(obj, protocol=None,*,fix_imports=True)
pickle.dumps()
方法跟pickle.dump()
方法的區別在於,pickle.dumps()
方法不需要寫入文件中,它是直接返回一個序列化的bytes對象。
2.反序列化方法pickle.load()
序列化的方法爲 pickle.load(),該方法的相關參數如下:
pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
該方法實現的是將序列化的對象從文件file中讀取出來。它的功能等同於 Unpickler(file).load()。
關於參數file,有一點需要注意,必須是以二進制的形式進行操作(讀取)。
參考如下:
import pickle
with open('svm_model_iris.pkl', 'rb') as f:
model = pickle.load(f)
file爲'svm_model_iris.pkl'
,並且以二進制的形式('rb')讀取。
讀取的時候,參數protocol是自動選擇的,load()方法中沒有這個參數。
2.2 反序列化方法pickle.loads()
pickle.loads()方法的參數如下:
pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
pickle.loads()
方法跟pickle.load()方法的區別在於,pickle.loads()
方法是直接從bytes對象中讀取序列化的信息,而非從文件中讀取。
2.3 反序列化方法Unpickler(file).load()
pickle模塊提供了反序列化的面向對象的類方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict"),Pickler類有load()方法。
Unpickler(file).load() 實現的功能跟 pickle.load() 是一樣的。
關於Unpickler類的其他method,請參考官方API。