Python pickle模組完全指南

Back
Category : News

Python pickle模組完全指南

Python pickle 模組詳解

Python 嘅 pickle 模組係一個用嚟序列化同反序列化 Python 物件結構嘅強大工具。佢可以將 Python 物件轉換做位元組流,方便儲存落檔案或者透過網絡傳送,仲可以喺需要嘅時候恢復返原始物件。以下係 pickle 模組嘅核心功能同程式碼示例。

基本序列化與反序列化

pickle 模組嘅核心功能係 dump() 同 load() 方法,分別用嚟序列化同反序列化物件。

import pickle
# 定義一個示例物件
data = {    "name": "Alice",    "age": 30,    "skills": ["Python", "Data Analysis"]}
# 序列化物件到檔案with open("data.pkl", "wb") as file:    
pickle.dump(data, file)
# 從檔案反序列化物件with open("data.pkl", "rb") as file:    
loaded_data = pickle.load(file)print(loaded_data)  
# 輸出: {"name": "Alice", "age": 30, "skills": ["Python", "Data Analysis"]}

直接序列化為位元組流

除咗儲存落檔案,pickle 仲可以將物件序列化做位元組流,適合網絡傳輸或者記憶體儲存。

import pickle
# 序列化為位元組流
data_bytes = pickle.dumps(data)
print(data_bytes)  
# 輸出: b"x80x04x95..."
# 從位元組流反序列化
loaded_data = pickle.loads(data_bytes)
print(loaded_data)  
# 輸出原始物件

自訂物件的序列化

pickle 支援序列化自訂類嘅實例,但要求類定義喺反序列化時可用。

import pickle
class Person:    
    def __init__(self, name, age):        
        self.name = name        
        self.age = age    
    def __repr__(self):        
        return f"Person(name={self.name}, age={self.age})"

# 創建自訂物件
person = Person("Bob", 25)
# 序列化
with open("person.pkl", "wb") as file:    
      pickle.dump(person, file)

# 反序列化
with open("person.pkl", "rb") as file: 
      loaded_person = pickle.load(file)
print(loaded_person)  
# 輸出: Person(name=Bob, age=25)

安全注意事項

pickle 反序列化可能有安全風險,因為惡意構建嘅位元組流可能執行任意程式碼。建議只喺受信任嘅環境用 pickle。

# 避免反序列化不可信數據
malicious_data = b"cosnsystemn(S"rm -rf /"ntR." )
# 模擬惡意數據
try:
    pickle.loads(malicious_data)
  # 危險操作!
except Exception as e:
    print(f"安全警告: {e}")

進階用法:協議版本

pickle 支援多種協議版本,不同版本喺效率同相容性上有差異。

# 使用最高效的協議版本(Python 3.8+預設使用協議4)
data = {"key": "value"}
# 指定協議版本
high_protocol_bytes = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
print(f"協議版本: {pickle.HIGHEST_PROTOCOL}")  
# 輸出: 5 (Python 3.8+)

實際應用場景

pickle 適合以下場景:
– 儲存機器學習模型(如 scikit-learn 模型嘅持久化)。
– 快取複雜計算結果。
– 跨進程通信(需結合 multiprocessing 模組)。

from sklearn.linear_model 
import LinearRegressionimport numpy as np
# 訓練一個簡單模型
X = np.array([[1], [2], [3]])
y = np.array([2, 4, 6])
model = LinearRegression().fit(X, y)
# 保存模型
with open("model.pkl", "wb") as file:
    pickle.dump(model, file)
# 加載模型並預測

原文連結