官方文檔
簡介
pickle 是 Python 中用于對象序列化和反序列化的標準庫模塊。它可以將 Python 對象轉換為字節流,并將其保存到文件或通過網絡傳輸,在需要時再將其恢復為原來的 Python 對象。
模塊 pickle 實現了對一個 Python 對象結構的二進制序列化和反序列化。 “pickling” 是將 Python 對象及其所擁有的層次結構轉化為一個字節流的過程,而 “unpickling” 是相反的操作,會將(來自一個 binary file 或者 bytes-like object 的)字節流轉化回一個對象層次結構。 pickling(和 unpickling)也被稱為“序列化”, “編組” 或者 “平面化”。而為了避免混亂,此處采用術語 “封存 (pickling)” 和 “解封 (unpickling)”。
常見用法
保存和加載 Python 對象
保存和加載 Python 函數
def my_function(x):return x * 2with open('function.pkl', 'wb') as f:pickle.dump(my_function, f)with open('function.pkl', 'rb') as f:loaded_function = pickle.load(f)
print(loaded_function(5)) # 輸出 10
保存和加載 Python 模塊
import my_module
with open('module.pkl', 'wb') as f:pickle.dump(my_module, f)with open('module.pkl', 'rb') as f:loaded_module = pickle.load(f)
print(loaded_module.my_function(5)) # 假設 my_module 有一個 my_function 函數
序列化和反序列化
將對象序列化為字節串:
import pickledata = {'a': 1, 'b': 2, 'c': 3}
serialized_data = pickle.dumps(data)
print(serialized_data) # 輸出字節串
從字節串反序列化為對象:
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # 輸出 {'a': 1, 'b': 2, 'c': 3}
處理復雜對象
pickle 可以序列化大多數 Python 對象,包括自定義類的實例:
class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person('Alice', 30)
with open('person.pkl', 'wb') as f:pickle.dump(person, f)with open('person.pkl', 'rb') as f:loaded_person = pickle.load(f)
print(loaded_person.name, loaded_person.age) # 輸出 Alice 30
增強安全性
由于 pickle 反序列化可能存在安全隱患,可以使用 pickle.Unpickler 類來增強安全性:
import pickle
from io import BytesIOclass CustomUnpickler(pickle.Unpickler):def find_class(self, module, name):# 只允許反序列化指定的類if module == 'builtins' and name in ['dict', 'list', 'tuple']:return super().find_class(module, name)raise pickle.UnpicklingError(f"Refused to unpickle class: {module}.{name}")data = b'...' # 從不可信來源獲取的序列化數據
bio = BytesIO(data)
unpickler = CustomUnpickler(bio)
try:unpickler.load()
except pickle.UnpicklingError as e:print(f"Error: {e}")
通過網絡傳輸 Python 對象
可以將序列化后的對象通過網絡傳輸,在接收端再反序列化為原對象。這在分布式系統中很有用。
保存復雜的 Python 對象
pickle 可以序列化大多數 Python 對象,包括類實例、函數、模塊等。這使得它能夠保存和恢復復雜的 Python 數據結構。
實現對象持久化
通過 pickle 可以將 Python 對象保存到文件中,實現對象的持久化存儲。這在需要保存程序狀態或緩存數據的場景下很有用。
總結
需要注意的是,pickle 模塊并不安全,不建議用于處理不可信的數據。因為反序列化的過程可能會執行任意的 Python 代碼,存在安全隱患。在使用 pickle 時,應確保數據的來源是可信的。