Python 的序列化套件-JSON與Pickle

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

序列化(serialization)是將資料結構或對象轉換為一個格式,可以被儲存到文件或記憶體中,或者可以透過網路傳輸到另一個系統環境。這使得資料可以在不同的系統之間進行交換,並在需要時重新建構回原始的資料結構。本文將介紹兩個好用的Python套件-JSON與Pickle,並比較兩者的不同。

JSON

JSON(Javascript Object Notation)是一種輕量級的資料交換格式。它基於 JavaScript 語言,但是獨立於語言和平台。JSON 易於人閱讀和寫作,同時也易於機器解析和生成。

在使用JSON套件時,需要先引入該套件:

import json

將資料結構轉換為字串

json.dumps(obj, skipkeys: bool, ensure_ascii: bool, indent: int) -> str
  • obj: 要序列化的 Python 對象。
  • skipkeys: 默認為 False。如果設為 True,則字典的鍵不是基本類型 (str, int, float, bool, None) 會被跳過,而不是引發 TypeError
  • ensure_ascii: 默認為 True。如果設為 True,所有非 ASCII 字符都會被轉義。
  • indent: 指定縮進的空格數,用於美化輸出。

例如,以下程式碼將字典 data 轉為字串 json_string

import json

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}
json_string = json.dumps(obj = data, indent = 4)
print(json_string)
print(type(json_string))
{
"name": "John",
"age": 30,
"city": "New York"
}
<class 'str'>

將資料結構寫入以字串的形式寫入檔案

將資料結構轉換成字串後,我們便可以將它寫入文字檔儲存,不過JSON套件已有函式可將資料結構以文本形式儲存到檔案,如下:

json.dump(obj, fp, skipkeys: bool, ensure_ascii: bool, indent: int)
  • fp: 一個 .write() 支持的文本文件對象。
  • 其餘參數與 json.dumps()相同

data寫入data.json:

import json

data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

with open('data.json', 'w', encoding = 'utf8') as file:
    json.dump(fp = file, obj = data, ensure_ascii = False, indent = 4)

data.json文件內容:

{
    "name": "John",
    "age": 30,
    "city": "New York"
}

將字串轉換為資料結構

json.loads(s)
  • s:要解碼的JSON字符串。

json_data轉為字典存入 data

import json

json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data)
print(f"name: {data['name']}")
print(f"age: {data['age']}")
print(f"city: {data['city']}")
print(type(data))
name: John
age: 30
city: New York
<class 'dict'>

讀取檔案並將其寫入資料結構

json.load(fp)
  • fp:一個 .read() 支持的文本文件對象。

例如讀取data.json並存入data中:

import json

with open('data.json', 'r', encoding = 'utf8') as file:
    data = json.load(file)

print(f"name: {data['name']}")
print(f"age: {data['age']}")
print(f"city: {data['city']}")
print(type(data))
name: John
age: 30
city: New York
<class 'dict'>

Pickle

Pickle 是 Python 的一個標準模組,用於序列化和反序列化 Python 對象結構。它可以序列化許多 Python 的資料類型,包括自定義的類。

在使用Pickle套件時,需要先引入該套件:

import pickle

將資料結構輸出為檔案

pickle.dump(obj, file, protocol, fix_imports)
  • obj: 要序列化的 Python 對象。
  • file: 一個 .write() 支持的二進制文件對象。
  • protocol: 指定使用的 pickling 協議。默認為 pickle.DEFAULT_PROTOCOL。可選的協議版本為 0, 1, 2, 3, 4。
    • 0: ASCII 協議,可讀性強,但效率較低。
    • 1: 舊的二進制協議。
    • 2: 在 Python 2.3 中引入的協議。
    • 3: 在 Python 3.0 中引入的協議,不兼容 Python 2。
    • 4: 在 Python 3.4 中引入,支持大於 4GB 的對象。
  • fix_imports: 默認為 True。如果為 Trueprotocol 小於 3,將修改 pickle 輸出,使其可以在 Python 2 中讀取。

例如將data輸出為data.obj:

import pickle
data = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

with open('data.obj', 'wb') as file:
    pickle.dump(data, file)

會產生一個data.obj的二進位檔。

將檔案轉化為資料結構

pickle.load(file, fix_imports, encoding, errors)
  • file: 一個 .read() 支持的二進制文件對象。
  • fix_imports: 默認為 True。用於控制對 Python 2 中生成的 pickle 數據的導入修復。
  • encoding: 默認為 'ASCII'。用於解碼 Python 2 中的 Unicode 字符串。其他常見的值包括 'latin1''utf8'
  • errors: 默認為 'strict'。指定如何處理解碼錯誤。其他可能的值包括 'replace''ignore'

例如讀取剛剛產生的data.obj:

import pickle

with open('data.obj', 'rb') as file:
    data = pickle.load(file)

print(f"name: {data['name']}")
print(f"age: {data['age']}")
print(f"city: {data['city']}")
print(type(data))
name: John
age: 30
city: New York
<class 'dict'>

JSON與Pickle的差異

  1. 資料格式:Json 產生的是文本格式,而 Pickle 產生的是字節流。
  2. 兼容性:Json 是一種跨語言的資料格式,而 Pickle 是 Python 專用的。
  3. 資料類型:Json 支持的資料類型較少,而 Pickle 可以序列化許多 Python 的資料類型。
    例如以下我們自定義一個class Data,有屬性nameagecity,以及一個建構子來初始化這三個屬性,並將它儲存至data.obj:
import pickle

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

data = Data('John', 30, 'New York')

with open('data.obj', 'wb') as file:
    pickle.dump(data, file)

會產生一個data.obj的二進為檔,我們讀取他並存於 new_data

import pickle

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

with open('data.obj', 'rb') as file:
    data = pickle.load(file)

print(f"name: {data.name}")
print(f"age: {data.age}")
print(f"city: {data.city}")
print(type(data)
name: John
age: 30
city: New York
<class '__main__.Data'>

以上就是Python的序列化套件介紹,在之後的深度學習也會很常用到這兩個套件,感謝各位的閱讀!

留言
avatar-img
留言分享你的想法!
avatar-img
HataRin的沙龍
14會員
4內容數
HataRin的沙龍的其他內容
2023/09/15
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
2023/09/15
動態規劃(Dynamic Programming)的基本思想是將複雜的問題分解為較小的子問題,並找到這些子問題的關聯性,通過這些子問題的解,我們可以避免重複計算,從而節省計算資源。這種過程稱為「記憶化(Memoization)」,通常使用數組或字典來實現,以在後續的計算中快速查找和重用中間結果。
Thumbnail
2023/08/29
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
Thumbnail
2023/08/29
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
Thumbnail
2023/08/26
在當今的數位時代,圖像處理已成為許多應用和項目的核心部分,從網站設計到機器學習,高效且靈活的圖像處理工具變得越來越重要。本文將介紹一個好用的Python套件-Pillow,Pillow套件是Python Imaging Library(PIL)的一個分支雖,然它不像Photoshop等軟體一樣強大,
Thumbnail
2023/08/26
在當今的數位時代,圖像處理已成為許多應用和項目的核心部分,從網站設計到機器學習,高效且靈活的圖像處理工具變得越來越重要。本文將介紹一個好用的Python套件-Pillow,Pillow套件是Python Imaging Library(PIL)的一個分支雖,然它不像Photoshop等軟體一樣強大,
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
JSON(JavaScript Object Notation)是AJAX(參考:[PHP][AJAX]介紹)常用的資料交換格式。在PHP有提供函數,可以將資料轉換成JSON。除外JSON比XML快速且簡單。 語法 資料是由鍵和值(Key-value)組成。 鍵和值之間用「:」區隔。 資料之
Thumbnail
JSON(JavaScript Object Notation)是AJAX(參考:[PHP][AJAX]介紹)常用的資料交換格式。在PHP有提供函數,可以將資料轉換成JSON。除外JSON比XML快速且簡單。 語法 資料是由鍵和值(Key-value)組成。 鍵和值之間用「:」區隔。 資料之
Thumbnail
我們在「【💊 Python的解憂錦囊】如何將dict轉成json並儲存」有介紹過如何將dict型態的資料轉換成json,除了json之外, 另一個耳熟能詳的資料交換格式就是csv了, 我們常常會將csv讀進來, 並使用預先設計的@dataclass來存放, 如此一來實際運行時, 更能夠貼近於我
Thumbnail
我們在「【💊 Python的解憂錦囊】如何將dict轉成json並儲存」有介紹過如何將dict型態的資料轉換成json,除了json之外, 另一個耳熟能詳的資料交換格式就是csv了, 我們常常會將csv讀進來, 並使用預先設計的@dataclass來存放, 如此一來實際運行時, 更能夠貼近於我
Thumbnail
關於json的資料交換格式請參考「【程式語言 - Javascript】輕量資料格式 JSON」, 我們常常會在使用套件的過程中發現回傳值的型態都會有「dict」的蹤跡, 為什麼呢? 因為動態、彈性、靈活, 不需要預先定義類別來明確指定每個欄位的內容, 但缺點就是文件必須寫清楚內容物是哪些, 否
Thumbnail
關於json的資料交換格式請參考「【程式語言 - Javascript】輕量資料格式 JSON」, 我們常常會在使用套件的過程中發現回傳值的型態都會有「dict」的蹤跡, 為什麼呢? 因為動態、彈性、靈活, 不需要預先定義類別來明確指定每個欄位的內容, 但缺點就是文件必須寫清楚內容物是哪些, 否
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
您是否苦於網路資訊爆炸嗎? 教學何其多,但卻無法好好選擇的困境呢? 歡迎加入「🔒 阿Han的軟體心法實戰營」, 這裡不給您冗餘的雜訊, 單刀直入直接送您重點, 避開選擇障礙的困境, 讓您獲得業界標準的開發起手式, 成為Top 1的頂尖人才。 身為專業的軟體開發者的我們, 除了讓程式會動之外, 也
Thumbnail
序列化(serialization)是將資料結構或對象轉換為一個格式,可以被儲存到文件或記憶體中,或者可以透過網路傳輸到另一個系統環境。這使得資料可以在不同的系統之間進行交換,並在需要時重新建構回原始的資料結構。本文將介紹兩個好用的Python套件-JSON與Pickle,並比較兩者的不同。
Thumbnail
序列化(serialization)是將資料結構或對象轉換為一個格式,可以被儲存到文件或記憶體中,或者可以透過網路傳輸到另一個系統環境。這使得資料可以在不同的系統之間進行交換,並在需要時重新建構回原始的資料結構。本文將介紹兩個好用的Python套件-JSON與Pickle,並比較兩者的不同。
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
JSON 全名 JavaScript Object Notation,其格式基本上就是key: value的組成如下: { "name": "Bob", "age": 40, "childs": [ { "name": "Justin", "
Thumbnail
JSON(JavaScript Object Notation)是一種常用的數據交換格式,用於在不同的應用程序之間傳遞結構化數據。在C#中,我們可以使用Newtonsoft.Json模組來處理JSON資料。
Thumbnail
JSON(JavaScript Object Notation)是一種常用的數據交換格式,用於在不同的應用程序之間傳遞結構化數據。在C#中,我們可以使用Newtonsoft.Json模組來處理JSON資料。
Thumbnail
Hi,大家好。我是茶桁。 系统内置模块就是安装完Python解释器之后,系统本身所提供的模块。我知道,咱们之前的课程里有学习系统的内置函数,这个模块和函数不是一个东西。模块这种东西,是需要导入后才可以使用的,比如:json, re, os等等。
Thumbnail
Hi,大家好。我是茶桁。 系统内置模块就是安装完Python解释器之后,系统本身所提供的模块。我知道,咱们之前的课程里有学习系统的内置函数,这个模块和函数不是一个东西。模块这种东西,是需要导入后才可以使用的,比如:json, re, os等等。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News