就如醃黃瓜可以存放一段時間,我們也希望程式裡面的一些 Session,Data,甚至是學習結果,都可以存到冰箱裡面(蛤?沒錯,我們今天就要跟大家介紹 Python 的 Pickle 套件~
環境安裝
pip install pickle
我們通常在使用 Pickle 的時候都會用 Pickling 這個詞;其實 Pickle 實際上是在對 Python 物件(Objects)做 Serialization/Deserialization。序列化基本上是將一個在記憶體裡的物件轉換成一個字節串流(byte stream)方便做儲存或存取。可序列化的東西有一些基本變數如:int,float,str,tuple,list,set,dict 和模組中的 top-level class/function。
看到 Serialization 的時候大家可能一時會想到 JSON,Pickle 跟 JSON 大致上是同樣的概念。只是差別在於 Pickle 是 Python 專屬的序列化,並且也沒有 JSON 的可讀性。
Pickling
大概知道 Serialization 的基本概念之後,我們來開始實作吧~ 我們在範例程式碼做的東西基本上就是開啓一個新的 .pickle
檔案開起來,並且將我們在上面初始化的 KNN 模型儲存到 knn.pickle
裏面。現在可以到程式目錄地下查看是否有這個檔案,並且如果用記事本打開的話會有亂碼。過了一個永恆, 如果要再呼叫這個模型的話,只需要開啓之前的 .pickle
import pickle
from sklearn.neighbors import KNeighborsClassifier as KNN
knn = KNN(n_neighbors = 3)
with open('knn.pickle', 'wb') as f:
pickle.dump(knn, f)
f.close()
Unpickling
過了一個永恆, 如果要再呼叫這個模型的話,只需要開啓之前的 .pickle
檔案,我們就可以呼叫這個模型了。可以注意輸出的地方 n_neighbors
的變數符合我們之前所設的 3,而不是預設的 5。(大家也可以 print(KNN())看看哦~)
with open('knn.pickle', 'rb') as f:
load = pickle.load(f)
print(load)
f.close()
# Output:
# KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
# metric_params=None, n_jobs=None, n_neighbors=3, p=2,
# weights='uniform')
對了,大家也要小心不要隨便拿陌生人的 .pickle
檔案來反序列化,因爲是可以將惡意程式碼寫到 .pickle
檔裏。想要更了解這個漏洞的人可以看看 OWASP 所做的這個影片。