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
13會員
4內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
今天要來介紹的是Python中資料型別的函數, 這幾天學習的素材是Youtube上“程式柴大大的Python 6 小時初學者課程”,一步一步帶著大家操作並解,學習中也別忘了要多多練習,練習的部分我是把我學到的東西請Chatgpt幫我出類似的題型並讓我練習。 以下我先寫出一個簡單的code,再加以
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
※ 常用Object(物件)型態的方法: 拿到object裡面某個key的value(值): 拿到所有屬性: ※ 存取物件屬性:點記法與括號記法 使用點記法 (dot notation) 或括號記法 (bracket notation) 來存取物件的值,以下兩種寫法的結果是一樣的: //
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。
Thumbnail
JSON 格式因為其輕巧、易於讀寫的特性,所以普遍應用於數據儲存。本文將介紹如何使用 Python 來讀取、處理、解析和修改 JSON 檔案。
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
Thumbnail
在 Python 中,print( ) 函數用於將結果輸出到螢幕上。當你嘗試將不同資料型別(例如字串和數字)混合在一起輸出時,print( )函數無法直接處理這些不同型別的資料,因此你需要先將它們轉換為相同的資料型別。通常,這意味著需要將數字轉換為字串型別,以便與其他字串一同輸出。 雖然我們也可以
Thumbnail
今天要來介紹的是Python中資料型別的函數, 這幾天學習的素材是Youtube上“程式柴大大的Python 6 小時初學者課程”,一步一步帶著大家操作並解,學習中也別忘了要多多練習,練習的部分我是把我學到的東西請Chatgpt幫我出類似的題型並讓我練習。 以下我先寫出一個簡單的code,再加以
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
※ 常用Object(物件)型態的方法: 拿到object裡面某個key的value(值): 拿到所有屬性: ※ 存取物件屬性:點記法與括號記法 使用點記法 (dot notation) 或括號記法 (bracket notation) 來存取物件的值,以下兩種寫法的結果是一樣的: //
Thumbnail
JS 資料型別分為兩大類,原始型別 (Primitive values) 和物件型別 (Objects)。
Thumbnail
f字符串(f-string)在Python 3.6版本引入了新特性,可以更方便地格式化字符串。本文介紹了f-string的基本使用方法,以及表達式、運算符、格式化控制、字典和列表的應用,以及調用方法和函數等。f-string提供了一種更靈活的方式,使你能夠控制字符串的外觀,以滿足不同情況下的需求。
Thumbnail
JSON 格式因為其輕巧、易於讀寫的特性,所以普遍應用於數據儲存。本文將介紹如何使用 Python 來讀取、處理、解析和修改 JSON 檔案。
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞