[Python教學] 進階:序列化與反序列化

更新於 發佈於 閱讀時間約 9 分鐘

在現代的軟體開發中,序列化(Serialization)與反序列化(Deserialization)是不可或缺的技術。這些操作廣泛用於資料存儲、網路傳輸以及跨平台的數據交換。Python 提供了多種工具和庫來實現這些功能,例如 picklejsonyaml 等。

本篇文章將詳細介紹序列化與反序列化的概念、Python 的內建支援,以及如何在不同場景中靈活運用。


什麼是序列化與反序列化?

  1. 序列化:將物件(如字典、列表、類別實例)轉換為字節流或可傳輸的格式(如 JSON 字符串),以便存儲或傳輸。
  2. 反序列化:將字節流或傳輸的數據恢復為原始物件。

為什麼需要序列化?

  • 儲存數據:將 Python 物件保存到文件中,供日後使用。
  • 數據傳輸:在不同系統之間傳遞數據(例如通過 API 傳輸 JSON)。
  • 持久化:在程序結束後保留運行中的物件狀態。

Python 常用的序列化工具

1. 使用 pickle

pickle 是 Python 的內建模組,用於將 Python 物件序列化為字節流,並可隨時反序列化。

基本用法

import pickle

# 原始物件
data = {"name": "Alice", "age": 25, "hobbies": ["reading", "cycling"]}

# 序列化:將物件轉換為字節流
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)

優缺點

  • 優點:支持幾乎所有 Python 物件(包括類別與函數)。
  • 缺點:只能在 Python 環境中使用,不適合跨平台傳輸。

2. 使用 json

json 是一種輕量級的數據交換格式,常用於網路應用程式中。Python 提供了內建的 json 模組。

基本用法

import json

# 原始物件
data = {"name": "Bob", "age": 30, "hobbies": ["gaming", "hiking"]}

# 序列化:將物件轉換為 JSON 字符串
json_string = json.dumps(data, indent=4)
print(json_string)

# 反序列化:將 JSON 字符串轉回 Python 物件
loaded_data = json.loads(json_string)
print(loaded_data)

序列化到文件

# 將 JSON 保存到文件
with open("data.json", "w") as file:
json.dump(data, file, indent=4)

# 從文件加載 JSON
with open("data.json", "r") as file:
loaded_data = json.load(file)

print(loaded_data)

優缺點

  • 優點:可讀性高,支持跨平台數據交換。
  • 缺點:不支持自定義物件(需要自定義編碼與解碼方法)。

處理自定義物件

class Person:
def __init__(self, name, age):
self.name = name
self.age = age

# 自定義序列化方法
def custom_encoder(obj):
if isinstance(obj, Person):
return {"name": obj.name, "age": obj.age}
raise TypeError("Type not serializable")

# 自定義反序列化方法
def custom_decoder(dct):
if "name" in dct and "age" in dct:
return Person(dct["name"], dct["age"])
return dct

person = Person("Charlie", 35)

# 序列化
json_string = json.dumps(person, default=custom_encoder, indent=4)
print(json_string)

# 反序列化
loaded_person = json.loads(json_string, object_hook=custom_decoder)
print(loaded_person.name, loaded_person.age)

3. 使用 yaml

yaml 是另一種常見的數據表示語言,語法簡潔且可讀性高。

基本用法

首先安裝 PyYAML

pip install pyyaml
import yaml

# 原始物件
data = {"name": "Diana", "age": 28, "hobbies": ["painting", "skiing"]}

# 序列化:轉換為 YAML 格式
yaml_string = yaml.dump(data)
print(yaml_string)

# 反序列化:從 YAML 恢復物件
loaded_data = yaml.load(yaml_string, Loader=yaml.SafeLoader)
print(loaded_data)

優缺點

  • 優點:語法簡潔,適合配置文件。
  • 缺點:依賴額外的庫。

序列化與反序列化的進階應用

1. 文件數據持久化

將程序狀態保存為文件,方便下次載入。

import pickle

# 保存用戶設置
user_settings = {"theme": "dark", "font_size": 14}
with open("settings.pkl", "wb") as file:
pickle.dump(user_settings, file)

# 加載用戶設置
with open("settings.pkl", "rb") as file:
settings = pickle.load(file)

print(settings)

2. 通過 API 傳輸數據

利用 JSON 序列化與反序列化進行 HTTP 通訊。

import json
import requests

# 發送數據
data = {"username": "user123", "score": 95}
response = requests.post("https://example.com/api/submit", json=data)
print(response.status_code)

# 接收數據
response = requests.get("https://example.com/api/results")
result_data = response.json()
print(result_data)

常見錯誤與解決方法

1. 無法序列化自定義物件

如果直接嘗試序列化類別實例,會引發 TypeError

解決方法:自定義編碼與解碼方法(如上 json 示例中的 custom_encodercustom_decoder)。

2. 格式不兼容

例如,使用 pickle 保存的數據無法在不同 Python 版本中解析。

解決方法:選擇跨平台的格式,如 JSON 或 YAML。

3. 敏感數據存儲

序列化敏感數據時,可能引發安全問題(如反序列化惡意數據)。

解決方法:避免使用 pickle 處理不信任的數據,並考慮數據加密。


結論

本篇文章詳細介紹了 Python 序列化與反序列化的相關知識,涵蓋了 picklejsonyaml 的基礎與進階用法。這些技術在數據存儲、傳輸以及程序狀態持久化中有著重要作用。希望這篇文章能幫助你掌握 Python 的序列化技術!

歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
留言
avatar-img
留言分享你的想法!

































































使用Python的Pandas和Matplotlib來讀取.csv檔案並進行資料可視化是一個常見的數據分析流程。以下是詳細的教學文章,將使用不同的公開資料集來展示如何繪製折線圖、柱狀圖、散點圖和圓餅圖。
PyCharm 是由 JetBrains 開發的一款功能強大的 Python 集成開發環境(IDE),它提供了許多便捷的功能,讓程式設計師可以更高效地編寫 Python 程式。無論你是 Python 初學者還是經驗豐富的開發者,PyCharm 都能提供優質的開發體驗。
在 Python 的數據處理與科學計算領域,NumPy 是一個不可或缺的基礎工具。它的強大在於提供了高效的多維陣列操作,並支援向量化運算,極大地提升了程式執行效率。本篇文章將詳細介紹 NumPy 的基本概念、功能以及實踐應用,幫助你快速上手這個重要的工具。
以下是針對上一篇文章"[Python教學] Seaborn:高階資料視覺化工具"的課後練習中每個問題的詳細解答,包括程式碼和結果解釋。
Seaborn 是一個基於 Matplotlib 的高階資料視覺化庫,專為統計圖表設計。與 Matplotlib 相比,Seaborn 提供了更簡潔的語法、更美觀的預設樣式,以及與 Pandas 的緊密整合,非常適合用於數據分析和探索性資料分析 (EDA)。
Matplotlib 是 Python 中最流行且功能強大的資料視覺化工具之一。它能夠生成各種靜態、動態及互動式的圖表,是資料分析與科學計算的重要組成部分。在本教學中,我們將詳細介紹 Matplotlib 的核心功能,並以範例逐步展示如何繪製基本與進階圖表。
使用Python的Pandas和Matplotlib來讀取.csv檔案並進行資料可視化是一個常見的數據分析流程。以下是詳細的教學文章,將使用不同的公開資料集來展示如何繪製折線圖、柱狀圖、散點圖和圓餅圖。
PyCharm 是由 JetBrains 開發的一款功能強大的 Python 集成開發環境(IDE),它提供了許多便捷的功能,讓程式設計師可以更高效地編寫 Python 程式。無論你是 Python 初學者還是經驗豐富的開發者,PyCharm 都能提供優質的開發體驗。
在 Python 的數據處理與科學計算領域,NumPy 是一個不可或缺的基礎工具。它的強大在於提供了高效的多維陣列操作,並支援向量化運算,極大地提升了程式執行效率。本篇文章將詳細介紹 NumPy 的基本概念、功能以及實踐應用,幫助你快速上手這個重要的工具。
以下是針對上一篇文章"[Python教學] Seaborn:高階資料視覺化工具"的課後練習中每個問題的詳細解答,包括程式碼和結果解釋。
Seaborn 是一個基於 Matplotlib 的高階資料視覺化庫,專為統計圖表設計。與 Matplotlib 相比,Seaborn 提供了更簡潔的語法、更美觀的預設樣式,以及與 Pandas 的緊密整合,非常適合用於數據分析和探索性資料分析 (EDA)。
Matplotlib 是 Python 中最流行且功能強大的資料視覺化工具之一。它能夠生成各種靜態、動態及互動式的圖表,是資料分析與科學計算的重要組成部分。在本教學中,我們將詳細介紹 Matplotlib 的核心功能,並以範例逐步展示如何繪製基本與進階圖表。
你可能也想看
Google News 追蹤
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
在Python中, 要寫一個完整的「符元化類 Tokenizer Class」, 這個Class需要的功能有: 1.「編碼 Encode」:將「文本 Text」分割成「符元 Token」。 2.「詞彙 Vocabulary」:將「符元 Token」映射到「符元ID TokenID
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
在Python中, 要寫一個完整的「符元化類 Tokenizer Class」, 這個Class需要的功能有: 1.「編碼 Encode」:將「文本 Text」分割成「符元 Token」。 2.「詞彙 Vocabulary」:將「符元 Token」映射到「符元ID TokenID
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。