Skip to content
  • Home
  • Python教學
  • 科技新聞資訊
  • 網站開發教學
Copyright 網絡設計教學 2025
Theme by ThemeinProgress
Proudly powered by WordPress
  • Home
  • Python教學
  • 科技新聞資訊
  • 網站開發教學
網絡設計教學網絡設計教學,網站網頁教學,軟體使用教學
  • You are here :
  • Home
  • python網頁教學
  • Python序列化與反序列化相關知識總結 python 程式碼
python網頁教學

Python序列化與反序列化相關知識總結 python 程式碼

Jiking 2022-09-24 Article

Python序列化與反序列

在程式運行的過程中,所有的變量都是在內存中,比如,定義一個 dict:

d = dict(name='Bob', age=20, score=88)

可以隨時修改變量,比如把 name 改成 ‘Bill’,但是一旦程式結束,變量所占用的內存就被操作系統全部回收。如果沒有把修改後的 ‘Bill’ 存儲到磁盤上,下次重新運行程式,變量又被初始化為 ‘Bob’。

我們把變量從內存中變成可存儲或傳輸的過程稱之為序列化,在 Python 中叫 pickling,在其他語言中也被稱之為 serialization,marshalling,flattening 等等,都是一個意思。
​序列化之後,就可以把序列化後的內容寫入磁盤,或者通過網絡傳輸到別的機器上。

未命名表單.png
​

反過來,把變量內容從序列化的對象重新讀到內存裡稱之為反序列化,即 unpickling。

Python 提供瞭 pickle 模塊來實現序列化。首先,我們嘗試把一個對象序列化並寫入档案:

In [1]: import pickle

In [2]: d = dict(name='Bob', age=20, score=88)

In [3]: pickle.dumps(d)
Out[3]: b'\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03Bob\x94\x8c\x03age\x94K\x14\x8c\x05score\x94KXu.'

pickle.dumps() 方法把任意對象序列化成一個 bytes,然後,就可以把這個 bytes 寫入档案。或者用另一個方法 pickle.dump() 直接把對象序列化後寫入一個 file-like Object:

In [5]: f = open('dump.txt', 'wb')

In [6]: d = dict(name='Bob', age=20, score=88)

In [7]: pickle.dump(d, f)

In [8]: f.close()

看看寫入的 dump.txt 档案,一堆亂七八糟的內容,這些都是 Python 保存的對象內部信息。

image.png

當我們要把對象從磁盤讀到內存時,可以先把內容讀到一個 bytes,然後用 pickle.loads() 方法反序列化出對象,也可以直接用 pickle.load() 方法從一個 file-like Object 中直接反序列化出對象。我們打開另一個 Python 命令行來反序列化剛才保存的對象:

In [23]: f = open('dump.txt', 'rb')

In [24]: d = pickle.load(f)

In [25]: f.close()

In [26]: d
Out[26]: {'name': 'Bob', 'age': 20, 'score': 88}

變量的內容又回來瞭!

當然,這個變量和原來的變量是完全不相幹的對象,它們隻是內容相同而已。

Pickle 的問題和所有其他編程語言特有的序列化問題一樣,就是它隻能用於 Python,並且可能不同版本的 Python 彼此都不兼容,因此,隻能用 Pickle 保存那些不重要的數據,不能成功地反序列化也沒關系。

JSON

如果我們要在不同的編程語言之間傳遞對象,就必須把對象序列化為標準格式,比如 XML,但更好的方法是序列化為 JSON,因為 JSON 表示出來就是一個字符串,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網絡傳輸。JSON 不僅是標準格式,並且比 XML 更快,而且可以直接在 Web 頁面中讀取,非常方便。
​

JSON 表示的對象就是標準的 JavaScript 語言的對象,JSON 和 Python 內置的數據類型對應如下:

JSON類型 Python類型
{} dict
[] list
“string” str
1234.56 int 或 float
true/false True/False
null None

Python 內置的 json 模塊提供瞭非常完善的 Python 對象到 JSON 格式的轉換。我們先看看如何把 Python對象變成一個 JSON:

In [27]: import json

In [28]: d = dict(name='Bob', age=20, score=88)

In [29]: json.dumps(d)
Out[29]: '{"name": "Bob", "age": 20, "score": 88}'

In [30]: type(json.dumps(d))
Out[30]: str

dumps() 方法返回一個 str,內容就是標準的 JSON。類似的,dump() 方法可以直接把 JSON 寫入一個 file-like Object。

要把 JSON 反序列化為 Python 對象,用 loads() 或者對應的 load() 方法,前者把 JSON 的字符串反序列化,後者從 file-like Object 中讀取字符串並反序列化:

In [31]: json_str = '{"age": 20, "score": 88, "name": "Bob"}'

In [32]: json.loads(json_str)
Out[32]: {'age': 20, 'score': 88, 'name': 'Bob'}

In [33]: type(json.loads(json_str))
Out[33]: dict

由於 JSON 標準規定 JSON 編碼是 UTF-8,所以我們總是能正確地在 Python 的 str 與 JSON 的字符串之間轉換。

JSON 進階

Python 的 dict 對象可以直接序列化為 JSON 的 {},不過,很多時候,我們更喜歡用 class . 表示對象,比如定義 Student 類,然後序列化:

import json

class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

s = Student('Bob', 20, 88)
print(json.dumps(s))

運行程式碼,毫不留情地得到一個 TypeError:

Traceback (most recent call last):
  ...
TypeError: Object of type Student is not JSON serializable

錯誤的原因是 Student 對象不是一個可序列化為 JSON 的對象。

如果連 class 的實例對象都無法序列化為 JSON,這肯定不合理!

別急,我們仔細看看 dumps() 方法的參數列表,可以發現,除瞭第一個必須的 obj 參數外,dumps() 方法還提供瞭一大堆的可選參數:https://docs.python.org/3/library/json.html#json.dumps

這些可選參數就是讓我們來定制 JSON 序列化。前面的程式碼之所以無法把 Student 類實例序列化為 JSON,是因為默認情況下,dumps() 方法不知道如何將 Student 實例變為一個 JSON 的 {} 對象。

可選參數 default 就是把任意一個對象變成一個可序列為 JSON 的對象,我們隻需要為 Student 專門寫一個轉換函數,再把函數傳進去即可:

In [40]: s.name
Out[40]: 'Bob'

In [41]: s.age
Out[41]: 20

In [42]: s.score
Out[42]: 88
def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

這樣,Student 實例首先被 student2dict() 函數轉換成 dict,然後再被順利序列化為 JSON:

print(json.dumps(s, default=student2dict))

不過,下次如果遇到一個 Teacher 類的實例,照樣無法序列化為 JSON。再寫一個函數 也可以,但是我們可以偷個懶,把任意 class 的實例變為 dict:

print(json.dumps(s, default=lambda obj: obj.__dict__))

因為通常 class 的實例都有一個 __dict__ 屬性,它就是一個 dict,用來存儲實例變量。也有少數例外,比如定義瞭 __slots__ 的 class。

同樣的道理,如果我們要把 JSON 反序列化為一個 Student 對象實例,loads() 方法首先轉換出一個 dict 對象,然後,我們傳入的 object_hook 函數負責把 dict 轉換為 Student 實例:

def dict2student(d):
    return Student(d['name'], d['age'], d['score'])

運行結果如下:

In [48]: json_str = '{"age": 20, "score": 88, "name": "Bob"}'

In [49]: def dict2student(d):
    ...:     return Student(d['name'], d['age'], d['score'])
    ...:

In [50]: print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x1065c6f70>

打印出的是反序列化的 Student 實例對象。

練習

對中文進行 JSON 序列化時,json.dumps() 提供瞭一個 ensure_ascii 參數,觀察該參數對結果的影響:

import json

obj = dict(name='小明', age=20)
s = json.dumps(obj, ensure_ascii=True)
print(s)

小結

Python 語言特定的序列化模塊是pickle,但如果要把序列化搞得更通用、更符合 Web 標準,就可以使用 json 模塊。

json 模塊的 dumps() 和 loads() 函數是定義得非常好的接口的典范。當我們使用時,隻需要傳入一個必須的參數。但是,當默認的序列化或反序列機制不滿足我們的要求時,我們又可以傳入更多的參數來定制序列化或反序列化的規則,既做到瞭接口簡單易用,又做到瞭充分的擴展性和靈活性。

到此這篇關於Python序列化與反序列化相關知識總結的文章就介紹到這瞭,更多相關Python序列化與反序列內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支援!

You may also like

Shopify 直營店 | Tapswap 程式碼 |如何快速輕鬆地建立 Shopify 直銷商店

Shopify 直銷業務藍圖 | Tapswap 程式碼 | Shopify Dropshipping 藍圖:完整教學

這是 eBay 和 Shopify 上的「商店」Prismatic Evolutions 預購詐騙嗎?特雷科TCG

Shopify 上的直銷業務 | Tapswap 程式碼 |立即開始在 Shopify 上進行代發貨:完整設定教學

Shopify 上的直銷業務 | Tapswap 程式碼 |立即開始在 Shopify 上進行代發貨:完整設定教學

Shopify 直營店 | Tapswap 程式碼 |如何快速輕鬆地建立 Shopify 直銷商店

相关贴文:

  1. 總結python多進程multiprocessing的相關知識 python 程式碼
  2. 關於python中readlines函數的參數hint的相關知識總結 python 程式碼
  3. Python創建類的方法及成員訪問的相關知識總結 python 程式碼
  4. Python函數中的不定長參數相關知識總結 python 程式碼
  5. Python實現字典序列ChainMap python 程式碼
  6. Python基礎之循環語句相關知識總結 python 程式碼
  7. python入門課程第五講之序列和字符串 python 程式碼
  8. Matlab實現時間序列預測分類實例代碼 python 程式碼
Tags: 化與, 序列, 相關知識, 程式碼

近期文章

  • 如何將亞馬遜會員產品添加到WooCommerce Shop教程
  • WooCommerce產品頁面設計 – Elementor&ACF
  • 澳大利亞的7個最佳優質WooCommerce運輸插件
  • 如何安裝和使用aliexpress dropshipping和for wooCommerce
  • WooCommerce Cart的預覽全部
  • WooCommerce浮動購物車插件|現代購物車#woocommerce #wordpress
  • 高級WooCommerce插件評論:WooCommerce的助推器
  • 免費的WooCommerce產品過濾插件#WooCommerce
  • 🔥新更新!使用SeedProd(無代碼)創建WooCommerce商店

標籤雲

Dropshipping ecommerce JavaScript Joomla OSCHINA博客 python REBELLION Shopify Shopify 商店設置 Shopify 直銷 Woocommerce WordPress 代發貨 刀塔2 和 商店 商業 喬姆拉 在 如何創建 Shopify 商店 如何在 如何建立 Shopify 商店 如何開始代出貨 年 店舖教學 店鋪化 店鋪培訓 教學 獲獎產品 直銷 Shopify 直銷教程 科技資訊 程式碼 網路業務 網路賺錢 臉書廣告 與 行銷 詳解 購物 跨平台 運輸船 適合初學者的 Shopify 教學課程 適合初學者的直銷 電子商務

Copyright 網絡設計教學 2025