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的序列化套件介紹,在之後的深度學習也會很常用到這兩個套件,感謝各位的閱讀!

13會員
4內容數
留言0
查看全部
發表第一個留言支持創作者!
HataRin的沙龍 的其他內容
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
在當今的數位時代,圖像處理已成為許多應用和項目的核心部分,從網站設計到機器學習,高效且靈活的圖像處理工具變得越來越重要。本文將介紹一個好用的Python套件-Pillow,Pillow套件是Python Imaging Library(PIL)的一個分支雖,然它不像Photoshop等軟體一樣強大,
上一篇文章說明了Pillow套件的基礎操作,這篇文章則會透過四個範例來示範如何利用Pillow製作簡單的GIF動畫。
在當今的數位時代,圖像處理已成為許多應用和項目的核心部分,從網站設計到機器學習,高效且靈活的圖像處理工具變得越來越重要。本文將介紹一個好用的Python套件-Pillow,Pillow套件是Python Imaging Library(PIL)的一個分支雖,然它不像Photoshop等軟體一樣強大,
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
包含著日期型資料在許多不同領域的分析中都非常重要,特別是當數據涉及隨時間變化的趨勢、模式或週期時,例如房價,股票價格分析等等。 如何將一個日期欄位改為 DataFrame 的索引,你可以使用 set_index() 方法。 實作範例數據來源 處理步驟 確保日期欄位是 datetime
Thumbnail
MinIO 是一個高性能的物件存儲系統,設計用於大規模的數據存儲需求, 甚至是各種非結構化數據也都能往這邊儲存, 也支持群集擴展, 非常適合正在尋找儲存方案的朋友們。 我們在「【💎 Message Queue - Kafka 案例篇】如何將檔案流上傳到minio - 完整檔案 」介紹了如
Thumbnail
在流程控制中,最常用的就是for loop 或是 while loop 語法了。 最常見的場景就是根據條件判斷式,重複執行特定的指令。 如果要在python寫出類似C/C++ for loop,可以怎麼寫呢? 透過索引去進行迭代 for var in range( start=0, sto
Thumbnail
訊息的即時傳遞已然成為現代社會的趨勢了, 影音也是如此, 即時! 即時! 即時! 已經是目前使用者體驗的必要元素了, 在這邊我們要分享的主題是如何在python程式語言的情境下使用ffmpeg來將音檔串流的轉換格式, 為什麼會有這樣的需求呢? 因為我們處理音檔時可能會需要統一輸出的格式, 當然背後也
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
Thumbnail
這個章節雖然發生問題, 但也很好的為我們如何解決問題的能力而訓練, 我們也會搭配AI來幫我們找問題, 當然也會一五一十的告訴您該如何問對問題, 關於問對問題很重要可以參考「」, 我們相信過程會對大家有幫助, 請耐心閱讀…, 我們會告訴您AI說正確但事實上並非正確的情境。 我們在「【🔒 Pytho
Thumbnail
請耐心閱讀到最後, 我們會提供更優雅的方式來處理這項需求… 故事起源 我們常常在使用Python的過程中會進行I/O的一些處理, 那麼最基本的就會是讀取檔案列表並對每一個特定的檔案名稱進行處理, 像這樣: import glob mp4_files = glob.glob(os.path
Thumbnail
在第五堂課中,我們將探討 Python 中的函式(functions)。 函式是一種讓我們可以將程式碼塊組織成一個獨立、可重複使用的單元的方式。 函式可以接受參數 (arguments) 並返回一個結果。 讓我們在新的文件 functions.py 中學習如何定義和使用函式。
Thumbnail
在第五課中,我們將探討 Python 中的函式(functions)。 函式是一種讓我們可以將程式碼塊組織成一個獨立、可重複使用的單元的方式。函式可以接受參數 (arguments) 並返回一個結果。
Thumbnail
我們將會學習 Python 中的數據結構。 主要的數據結構包括列表 (List)、元組 (Tuple)、字典 (Dictionary) 以及集合 (Set)。
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
包含著日期型資料在許多不同領域的分析中都非常重要,特別是當數據涉及隨時間變化的趨勢、模式或週期時,例如房價,股票價格分析等等。 如何將一個日期欄位改為 DataFrame 的索引,你可以使用 set_index() 方法。 實作範例數據來源 處理步驟 確保日期欄位是 datetime
Thumbnail
MinIO 是一個高性能的物件存儲系統,設計用於大規模的數據存儲需求, 甚至是各種非結構化數據也都能往這邊儲存, 也支持群集擴展, 非常適合正在尋找儲存方案的朋友們。 我們在「【💎 Message Queue - Kafka 案例篇】如何將檔案流上傳到minio - 完整檔案 」介紹了如
Thumbnail
在流程控制中,最常用的就是for loop 或是 while loop 語法了。 最常見的場景就是根據條件判斷式,重複執行特定的指令。 如果要在python寫出類似C/C++ for loop,可以怎麼寫呢? 透過索引去進行迭代 for var in range( start=0, sto
Thumbnail
訊息的即時傳遞已然成為現代社會的趨勢了, 影音也是如此, 即時! 即時! 即時! 已經是目前使用者體驗的必要元素了, 在這邊我們要分享的主題是如何在python程式語言的情境下使用ffmpeg來將音檔串流的轉換格式, 為什麼會有這樣的需求呢? 因為我們處理音檔時可能會需要統一輸出的格式, 當然背後也
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
Thumbnail
這個章節雖然發生問題, 但也很好的為我們如何解決問題的能力而訓練, 我們也會搭配AI來幫我們找問題, 當然也會一五一十的告訴您該如何問對問題, 關於問對問題很重要可以參考「」, 我們相信過程會對大家有幫助, 請耐心閱讀…, 我們會告訴您AI說正確但事實上並非正確的情境。 我們在「【🔒 Pytho
Thumbnail
請耐心閱讀到最後, 我們會提供更優雅的方式來處理這項需求… 故事起源 我們常常在使用Python的過程中會進行I/O的一些處理, 那麼最基本的就會是讀取檔案列表並對每一個特定的檔案名稱進行處理, 像這樣: import glob mp4_files = glob.glob(os.path
Thumbnail
在第五堂課中,我們將探討 Python 中的函式(functions)。 函式是一種讓我們可以將程式碼塊組織成一個獨立、可重複使用的單元的方式。 函式可以接受參數 (arguments) 並返回一個結果。 讓我們在新的文件 functions.py 中學習如何定義和使用函式。
Thumbnail
在第五課中,我們將探討 Python 中的函式(functions)。 函式是一種讓我們可以將程式碼塊組織成一個獨立、可重複使用的單元的方式。函式可以接受參數 (arguments) 並返回一個結果。
Thumbnail
我們將會學習 Python 中的數據結構。 主要的數據結構包括列表 (List)、元組 (Tuple)、字典 (Dictionary) 以及集合 (Set)。