[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
追極光的北極熊|軟體工程師的小天地
16會員
173內容數
歡迎來到我的部落格!這裡記錄了軟體工程師的日常生活點滴,並分享程式設計與演算法的實用教學。無論你是初學者還是有經驗的開發者,都能在這裡找到深入淺出的技術解析與實戰技巧。此外,我也會分享工作中的心路歷程與學習心得,讓你不僅學到技術,更能瞭解軟體開發的實際應用與挑戰。希望透過這個平台,能與你共同成長,激發對技術的熱情!
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/28
當我們開發程式時,功能能正常運作固然重要,但在資料量變大或執行時間變長時,效能就成為不可忽視的一環。尤其在 Web 應用、資料分析或科學運算中,程式跑得快與否,直接影響使用者體驗與系統成本。
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/22
嘿,大家好!上篇教學文章我們做出了一個待辦事項清單,已經有點小工具的感覺了吧?今天我們要再升級,來做個「簡單記事本」。這個專案不只可以寫東西,還能存檔、讀檔,甚至換字體大小,感覺就像自己寫了個迷你軟體!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
2025/04/16
嘿,大家好!走到這一步,我們已經玩過 Tkinter 的基本招式、佈局、事件處理,還搞了些進階元件,應該有點信心了吧?今天我們要把這些功夫練成一套連招,來做個實用的「待辦事項清單」(To-Do List),順便聊聊怎麼把程式寫得更漂亮、更好用。準備好了嗎?這就上場啦!
看更多
你可能也想看
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News