iT邦幫忙

0

Python 內建模組 Pickle & Shelve

  • 分享至 

  • xImage
  •  

Pickle 的序列化與反序列化

什麼是 Pickle?

Pickle 是 Python 提供的一個內建模組,
專門用於將 Python 物件序列化(serialize)和反序列化(deserialize)。它將 Python 物件轉換為二進制格式,便於儲存到檔案或傳輸到網路上,並且能夠隨時還原成原始的 Python 物件。

Pickle 的主要用途

  • 儲存 Python 物件到檔案:
    將變數(如列表、字典、類別等)儲存到磁碟,以便在未來的程式執行中重複使用。
  • 物件的網路傳輸:
    將 Python 物件序列化後,可以透過網路傳輸並在接收端反序列化還原。
  • 保存程式狀態:
    在某些情況下,可以用來保存程式的中間狀態,稍後繼續執行。

如何使用 Pickle?

  1. 匯入模組
    要使用 Pickle,首先要匯入 pickle 模組:
import pickle
  1. 將資料序列化並儲存到檔案
    使用 pickle.dump() 方法,可以將 Python 物件序列化後儲存在檔案中:
# 要儲存的物件
data = {"name": "Alice", "age": 30, "languages": ["Python", "C++", "Java"]}

# 打開檔案,以二進制寫入模式(wb)
with open("data.pkl", "wb") as file:
    pickle.dump(data, file)

print("資料已序列化並儲存到檔案 data.pkl")
  1. 從檔案中讀取資料並反序列化
    使用 pickle.load() 方法,可以將儲存的二進制格式資料反序列化為 Python 物件:
# 打開檔案,以二進制讀取模式(rb)
with open("data.pkl", "rb") as file:
    loaded_data = pickle.load(file)

print("從檔案中還原的資料:", loaded_data)

pickle常見情境:

  1. 保存複雜的 Python 資料結構
    當資料結構包含像是列表、字典,甚至自訂類別的物件,並且希望在稍後還原使用時,pickle 是一個快速且方便的工具。
    例如:
  • 中間處理結果的保存和讀取(如數據分析中的數據快取)。
  • 機器學習中訓練後的模型保存(如 scikit-learn 使用 pickle 保存模型)。
  1. 程序之間的數據傳遞
    如果有多個 Python 程序需要共享數據,可以透過 pickle 序列化資料,將其儲存到檔案或傳遞到其他程序。
    例如:
  • 保存狀態以供另一個程序讀取。
  • 透過網路或管道傳遞序列化的物件。
  1. 保存和還原工作進度
    如果程式執行需要很長時間,pickle 可用於保存執行的中間狀態,避免重複執行相同的操作。
    例如:
    長時間運行的數據處理工作中保存進度,然後在程序崩潰或中斷時還原。

  2. 快速測試或臨時保存
    在開發和測試中,pickle 可以用來臨時保存數據以快速調試或測試功能。

使用 pickle 的注意事項

安全性問題:
pickle 無法防範惡意數據,因此不要反序列化(pickle.load)不受信任的來源的數據。
與 JSON 的選擇:

當數據只包含基本類型(如字典、列表、數字、字符串等)時,應優先使用 JSON,因為 JSON 可讀性高且跨語言支持。
若數據包含複雜 Python 特定結構(如自訂類別或函數),可使用 pickle。

什麼時候不應該使用 pickle?

  • 需要跨語言操作:如果需要和非 Python 程序共享數據,應使用 JSON 或其他標準格式。
  • 需要數據長期保存:如果數據需要長期保存或存入資料庫,pickle 並不是最佳選擇,因為它受 Python 版本影響且可讀性差。

Shelve

shelve 是 Python 標準庫中一個方便的模組,
用於將 Python 物件存儲到一個類似字典的持久化對象中。
它結合了 pickle 的序列化能力和簡單的鍵值存取方式,
使得開發者可以輕鬆地保存和讀取 Python 的數據結構到文件中,
而不需要自己處理文件操作和序列化細節。

shelve 的特點

  1. 類似字典的操作方式:
    • 用法和字典類似,可以透過鍵值對儲存和讀取數據。
    • 使用時只需記住操作字典的方法,例如 db[key] = value。
  2. 自動序列化:
    • 支持將多種類型的 Python 物件(如字典、列表、自定義對象)直接保存到檔案中,底層使用 pickle 處理序列化。
  3. 持久化存儲:
    • 數據保存在硬碟文件中,程序重啟後仍能讀取。
  4. 效率較高:
    • 因為只在需要時加載數據,對於大數據集,比 JSON 或單一 pickle 文件更有效。
  5. 限制:
    • 只能使用字符串作為鍵。
    • 存儲的對象需可被 pickle 序列化。
    • 與數據庫的設計不同,適用於簡單數據存儲而非高併發操作。

基本使用範例

import shelve

# 開啟一個 shelve 檔案
with shelve.open("mydata") as db:
    # 儲存數據
    db["name"] = "Alice"
    db["age"] = 30
    db["skills"] = ["Python", "C++", "Java"]

    # 從檔案中讀取數據
    print(db["name"])  # 輸出: Alice
    print(db["age"])   # 輸出: 30
    print(db["skills"])  # 輸出: ['Python', 'C++', 'Java']
特性 Shelve Pickle JSON SQLite
儲存格式 類似字典的檔案 二進制檔案 文本檔案 數據庫檔案
可讀性
數據類型支持 任意 Python 對象 任意 Python 對象 基本數據類型 基本數據類型
操作方式 類似字典 程序控制序列化/反序列化 程序控制序列化/反序列化 SQL 操作
應用場景 小型數據持久化存儲 任意序列化需求 跨語言數據傳輸 結構化數據存儲

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言