Python 中的 pickle 載入
我們將介紹 Python 中的 pickle
庫以及如何在我們的 Python 應用程式中使用它。
Python 中的 pickle
作為資料科學家,我們在資料框、字典和任何其他形式的資料型別中使用資料集。在處理多個資料集時,我們可能需要將它們儲存在檔案中以供以後使用或以檔案的形式輕鬆共享。
Python 提供了一個庫 pickle
來幫助我們實現這一目標。Pickle
序列化物件,以便可以將它們儲存在檔案中並在需要時載入到程式中。
當我們想要序列化和反序列化 Python 物件時,我們使用 pickle
。序列化是將物件轉換為位元組流的過程,我們可以輕鬆地將其儲存在磁碟上或通過網路共享。
在 pickle
的幫助下,我們可以隨時輕鬆地將位元組流反序列化回 Python 物件。
Python 中 Pickle 的優點
- 如果我們想要資料的永續性,
Pickle
在應用程式中很有用。 - 如果我們想將程式的狀態資料儲存到磁碟中以備後用,我們可以使用
pickle
。 - 我們也可以使用
pickle
通過 TCP 或套接字連線傳送我們的資料或將資料儲存在我們的資料庫中。 - 如果你是資料科學家或使用機器學習演算法,我們希望儲存資料以進行預測,而不需要重複重寫或訓練模型,我們可以使用
pickle
。
Python 中 Pickle 的缺點
- Pickle 的協議是 Python 語言特有的,不能用於跨語言應用。
- 如果我們試圖對在不同版本的 Python 中醃製的檔案進行 unpickle,這可能會導致問題。
- 從不受信任的來源中提取資料也可能會導致問題。
- 如果我們試圖解壓的檔案中存在一些病毒或惡意程式碼,它可以被執行並導致一些問題。
在 Python 中提取檔案
布林值、整數、浮點數、複數、普通和 Unicode 字串、元組、列表、集合和字典資料型別可以使用 Python 的 pickle
庫獲取。
讓我們從一個示例開始,我們將在其中醃製一個檔案。首先,我們將匯入 pickle
庫,如下所示。
# python
import pickle
現在讓我們建立一個字典,將其儲存到檔案中,然後再次載入。
# python
cats_dict = { 'Tom': 5, 'Oggy': 7, 'Persia': 3, 'Luna': 2}
要醃製這個 cat 字典,我們首先需要指定儲存字典的檔名。我們可以使用 open()
函式開啟檔案進行寫入。
open()
函式有兩個引數,第一個是不帶副檔名的檔名,第二個是我們想要對檔案執行的操作的程式碼。
如果我們想用二進位制程式碼編寫檔案,我們將使用 wb
作為第二個引數。如下圖,w
代表寫入,b
代表二進位制模式。
# python
filename = 'cats'
file = open(filename, 'wb')
一旦我們開啟檔案進行寫入,我們可以使用 pickle.dump()
,它接受兩個引數。第一個是字典的名稱,第二個引數是我們開啟檔案的變數,如下所示。
# python
pickle.dump(cats_dict, file)
現在我們將關閉檔案。
# python
file.close()
此程式碼將在包含醃製資料的同一目錄中建立一個名為 cats
的新檔案。
輸出:
Python 中的 pickle 載入
現在讓我們使用 load()
方法解開剛剛醃製的檔案。當我們遇到在 Python 版本 2 中醃製的物件時,load()
函式會派上用場,現在我們正在執行 Python 3。
解封可能很困難,也很麻煩。我們可以通過在 Python 版本 2 中執行檔案來取消選擇檔案,或者我們可以使用 load()
函式中的 encoding='latin1'
來完成它,如下所示。
# python
filename = 'cats'
unpickleFile = open(filename, 'rb')
new_dict = pickle.load(unpickleFile, encoding='latin1')
如果你有包含 NumPy
陣列的物件,此方法將不起作用。如下所示,我們必須將編碼從 latin1
更改為 bytes
。
# python
filename = 'cats'
unpickleFile = open(filename, 'rb')
new_dict = pickle.load(unpickleFile, encoding='bytes')
輸出:
從上面的例子可以看出,我們很容易解壓檔案並得到正確的結果。
概括
在本教程中,我們瞭解了 pickle
庫;我們還了解了 pickle 的優缺點,以及何時何地不使用 pickle。我們學習瞭如何使用 load()
函式來 pickle 檔案和解除 pickle 檔案。
Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.
LinkedIn