Skip to content

[Python] 使用 Pickle 模組保存資料(持久化數據)

Last Updated on 2021-06-19 by Clay

今天我想要紀錄的是 pickle 這個模組。首先要說明的是,pickle 在 Python 中是相當相當有名的,它的運作方法跟 Json 有點像,都是可以壓縮資料、保存、並且隨時隨地解開我們儲存好的資料,還原我們 Python 的工作階段。

不過由於它是專門為 Python 而生的、而非像 Json 那般是『輕量級的資料儲存格式』,故若是需要跨語言進行開發時,pickle 這種儲存資料的格式可能就不太適合,不過若只是要進行 Python 專案的開發,那麼 pickle 可是非常非常方便的!

以下來簡單看個實際使用 pickle 的例子。


使用 pickle 儲存、讀取資料

由於 pickle 本身便是 Python 當中內建的模組,所以我們不需要使用額外的指令來安裝它,直接在程式中匯入即可。

我們來看段簡單的資料儲存:

import pickle

my_dict = {
    'a': 1,
    'b': 2,
    'c': 3,
}

with open('test.pickle', 'wb') as f:
    pickle.dump(my_dict, f)



我們可以使用 "dump()" 函式來儲存我們的資料,以上方程式碼為例,便是我的 "my_dict" 的資料。

以下再來紀錄使用 "load()" 讀取儲存好的 pickle 資料。

# Load
with open('test.pickle', 'rb') as f:
    new_dict = pickle.load(f)

print(new_dict)



Output:

{'a': 1, 'b': 2, 'c': 3}

這樣就簡單地將資料讀取進來了!

當然,熟悉 Json 的人可能會想:這樣跟 Json 有什麼不一樣?不都是儲存資料讀取資料嗎?連 Function 都一模一樣欸!

但不是這樣的,pickle 由於是專門支援 Python 的,故就像我上方所提及的一般,可以還原我們的『Python 工作階段』。

class dog:
    def __init__(self, color):
        self.color = color

puppy = dog('black')


with open('test.pickle', 'wb') as f:
    pickle.dump(puppy, f)



假設我們今天定義了一個 Class: dog,並建立 "color" 這個屬性。接著我們將 "puppy" 這個變數物件化,並賦予 "black" 這個顏色的屬性。

然後我們使用 pickle 儲存起來,這就是 Json 難以做到的了,Json 僅能支援部份的 Python 資料型態。

# Load
with open('test.pickle', 'rb') as f:
    my_dog = pickle.load(f)

print(my_dog.color)



Output:

black

我們可以看到,pickle 完美地還原了我們自定義的 Class,印出了 my_dog 的顏色,是不是很方便呢?

不過聽說 Json 的讀取速度還是比 pickle 快的。如果是進行大量資料的儲存讀取,或許還是使用 Json 會更好的一點。我也希望之後有空的時間能拿比較大量的資料自己做做看實驗。


References


Read More

Tags:

Leave a Reply