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。
GO TO FULL VERSION