序列化

Python SELF TW
等級 22 , 課堂 0
開放

8.1 什麼是序列化

在你學會如何操作檔案、保存和讀取資料後,現在是時候學習如何認真地處理檔案了。今天我們開始學習序列化。

序列化——是一個將對象轉換為字節序列或某種格式的過程,可以保存到檔案、透過網絡傳輸或保存到資料庫中。反序列化是反向過程,將字節序列重建成原始對象。

為了將對象保存到檔案(或通過網絡傳輸),你需要將其轉換為某種易於寫入檔案(和從檔案中讀取)或通過網絡傳輸的字符串(或字節集合)。

以下是序列化的四個主要應用方向:

  • 保存對象狀態:為了在程式多次執行之間保存對象的狀態。
  • 數據傳輸:在系統的不同組件或不同系統之間傳輸對象。
  • 緩存:將對象保存到緩存中以便快速訪問。
  • 資料庫:在資料庫中保存複雜的資料結構。

有很多專門負責序列化的庫,每個都是為了滿足特定需求而創建的。我們將介紹其中的五種,而其中的兩種我們將進行深入了解。

讓我們看看最受歡迎的它們:

  • 模組 pickle
  • 模組 json
  • 模組 yaml
  • 模組 marshal
  • 模組 shelve

以下是每個模組的簡單概覽:

8.2 模組 pickle

pickle 是一個內建的模組,用於序列化反序列化Python對象。它可以保存和還原幾乎所有的Python對象,包括自定義類別。

pickle的使用範例:


import pickle

# 用於序列化的對象範例
data = {'name': 'Alice', 'age': 30, 'is_student': False}
            
# 將對象序列化到檔案中
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)

8.3 模組 json

json 是一個內建的模組,用於處理 JSON (JavaScript Object Notation)。JSON 是一種文本格式,被用於客戶端和服務器之間的數據交換。

json的使用範例:


import json

# 用於序列化的對象範例
data = {'name': 'Bob', 'age': 25, 'is_student': True}
            
# 將對象序列化為 JSON 字符串
json_string = json.dumps(data)
print(json_string)
            
# 將對象序列化到 JSON 檔案中
with open('data.json', 'w') as file:
    json.dump(data, file)
            
# 從 JSON 字符串中反序列化對象
loaded_data = json.loads(json_string)
print(loaded_data)
            
# 從 JSON 檔案中反序列化對象
with open('data.json', 'r') as file:
    loaded_data = json.load(file)
print(loaded_data)

8.4 模組 yaml

yaml (YAML Ain't Markup Language) 是一種人類可讀的數據序列化格式。在Python中,PyYAML是用來操作YAML的第三方庫。

yaml的使用範例:


import yaml

# 用於序列化的對象範例
data = {'name': 'Carol', 'age': 27, 'is_student': False}
            
# 將對象序列化為 YAML 字符串
yaml_string = yaml.dump(data)
print(yaml_string)
            
# 將對象序列化到 YAML 檔案中
with open('data.yaml', 'w') as file:
    yaml.dump(data, file)
            
# 從 YAML 字符串中反序列化對象
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
            
# 從 YAML 檔案中反序列化對象
with open('data.yaml', 'r') as file:
    loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)

8.5 模組 marshal

marshal 是一個內建的模組,用於序列化Python的對象,特別是為了序列化Python的代碼。它比 pickle 更快,但是支持的對象類型更少且靈活性較差。

marshal的使用範例:


import marshal

# 用於序列化的對象範例
data = {'name': 'Dave', 'age': 35, 'is_student': True}

# 將對象序列化到檔案中
with open('data.marshal', 'wb') as file:
    marshal.dump(data, file)
            
# 從檔案中反序列化對象
with open('data.marshal', 'rb') as file:
    loaded_data = marshal.load(file)
            
print(loaded_data)

8.6 模組 shelve

shelve 是一個內建的模組,提供了一種簡單的方法將Python對象保存到檔案中,使用類似於字典的基於鍵的存儲。

shelve的使用範例:


import shelve

# 用於序列化的對象範例
data = {'name': 'Eve', 'age': 28, 'is_student': False}
            
# 將對象序列化到檔案中
with shelve.open('data.shelve') as db:
    db['person'] = data
            
# 從檔案中反序列化對象
with shelve.open('data.shelve') as db:
    loaded_data = db['person']
            
print(loaded_data)

雖然模組和保存資料的格式不同,但從程式設計師的角度來看,它們的操作非常相似。下面我們將更詳細地探討 模組 pickle模組 json

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION