就如醃黃瓜可以存放一段時間,我們也希望程式裡面的一些 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 所做的這個影片

Leave a Reply

Your email address will not be published. Required fields are marked *