婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python序列化與反序列化相關知識總結

Python序列化與反序列化相關知識總結

熱門標簽:聊城語音外呼系統 商家地圖標注海報 南陽打電話機器人 ai電銷機器人的優勢 打電話機器人營銷 海外網吧地圖標注注冊 騰訊地圖標注沒法顯示 孝感營銷電話機器人效果怎么樣 地圖標注自己和別人標注區別

Python序列化與反序列

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

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

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

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


反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即 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 保存的對象內部信息。

當我們要把對象從磁盤讀到內存時,可以先把內容讀到一個 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序列化與反序列內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python字符串的多行輸出的實例詳解
  • python字符串常規操作大全
  • Python字符串的15個基本操作(小結)
  • Python序列的推導式實現代碼
  • python序列類型種類詳解
  • python入門課程第五講之序列和字符串

標簽:南寧 牡丹江 聊城 六盤水 揚州 撫州 楊凌 迪慶

巨人網絡通訊聲明:本文標題《Python序列化與反序列化相關知識總結》,本文關鍵詞  Python,序列化,與,反,相關,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python序列化與反序列化相關知識總結》相關的同類信息!
  • 本頁收集關于Python序列化與反序列化相關知識總結的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    高清av一区二区| 亚洲一二三四久久| 欧美一区二区三区播放老司机| 久久精品人人做| 热久久一区二区| 欧美图片一区二区三区| 一色屋精品亚洲香蕉网站| 日韩av网站在线观看| 91老司机福利 在线| 国产精品美女久久久久久久久| 琪琪久久久久日韩精品| 欧美日韩的一区二区| 亚洲黄色小视频| 51久久夜色精品国产麻豆| 午夜电影一区二区| 精品日本一线二线三线不卡| 久久99国产精品尤物| 久久精品男人天堂av| 99国产精品久久| 调教+趴+乳夹+国产+精品| 欧美日韩国产成人在线免费| 日韩av午夜在线观看| 精品对白一区国产伦| 成人免费视频播放| 麻豆国产91在线播放| 自拍偷拍欧美激情| 欧美一区二区视频免费观看| 六月丁香综合在线视频| 中文字幕av免费专区久久| 欧美群妇大交群的观看方式| 国产一区二三区| 亚洲综合成人在线| 久久久久久97三级| 色噜噜狠狠色综合中国| 黑人巨大精品欧美一区| 日韩理论在线观看| 久久嫩草精品久久久精品一| youjizz国产精品| 国产一区二区久久| 免费在线观看不卡| 性做久久久久久| 国产一区二区女| av一本久道久久综合久久鬼色| 亚洲丶国产丶欧美一区二区三区| 亚洲精品在线免费观看视频| 亚洲一区视频在线| 久久99最新地址| 精品国产sm最大网站免费看| 欧美色区777第一页| 欧美伊人久久久久久久久影院| 成人av手机在线观看| 国产老女人精品毛片久久| 国产乱国产乱300精品| 国产suv一区二区三区88区| 国产成人免费av在线| bt7086福利一区国产| 欧美色图第一页| 久久久久亚洲综合| 亚洲人成在线播放网站岛国| 亚洲第一久久影院| 国产成人综合网站| 欧美一区二区视频在线观看2022| 精品美女在线播放| 亚洲综合色噜噜狠狠| 丁香另类激情小说| 色婷婷综合久色| 国产日产欧美一区二区视频| 亚洲一卡二卡三卡四卡无卡久久| 黄色成人免费在线| 欧美区一区二区三区| 亚洲男人都懂的| 99国产一区二区三精品乱码| 精品国产免费视频| 青青草国产精品亚洲专区无| 波多野结衣中文字幕一区二区三区 | 91视频精品在这里| 99精品黄色片免费大全| 国产色综合久久| 久久99九九99精品| 日韩精品一区国产麻豆| 久久国产欧美日韩精品| 日韩欧美一区二区久久婷婷| 日韩中文字幕不卡| 久久综合久久鬼色中文字| 国产综合色产在线精品| 日本一区二区三区国色天香| 日韩av电影免费观看高清完整版在线观看| 色综合久久久久网| 性感美女久久精品| 欧美精品一区二区蜜臀亚洲| 国产一区欧美一区| 亚洲一级片在线观看| 国产午夜一区二区三区| 91在线porny国产在线看| 亚洲在线成人精品| 久久久国产精品不卡| 欧美日本乱大交xxxxx| 国内精品伊人久久久久av影院| 国产性做久久久久久| 欧美日精品一区视频| 国产精品99久| 韩国精品久久久| 午夜精品国产更新| 欧美激情一区二区| 日韩一级成人av| 欧美色区777第一页| 97精品电影院| 99在线精品一区二区三区| 精品午夜久久福利影院| 亚洲在线一区二区三区| 国产精品久久久久久久第一福利| 日韩视频国产视频| 欧美午夜电影在线播放| 99久久免费视频.com| av激情综合网| 成人av免费在线观看| 成人黄色电影在线| 不卡在线视频中文字幕| 中文字幕国产一区二区| 国产精品午夜在线观看| 中文一区在线播放| 中文字幕色av一区二区三区| 亚洲欧美在线aaa| 亚洲美女少妇撒尿| 日韩av成人高清| 成人91在线观看| 欧美情侣在线播放| 欧美一区二区在线播放| 欧美激情自拍偷拍| 午夜电影一区二区三区| 狠狠色狠狠色合久久伊人| 成人国产一区二区三区精品| 日本久久一区二区| 欧美大片在线观看| 亚洲欧美日韩一区二区| 日韩av一区二区三区| 成人亚洲精品久久久久软件| 欧美三级中文字幕| 国产精品久久久久桃色tv| 青青青爽久久午夜综合久久午夜| 成人91在线观看| 精品少妇一区二区| 亚洲国产视频直播| 成人黄色在线看| 国产女主播一区| 九色综合狠狠综合久久| 欧美无砖专区一中文字| 亚洲欧美日韩久久精品| 色综合天天性综合| 有码一区二区三区| 99精品视频在线观看| 亚洲另类春色校园小说| 色妞www精品视频| 亚洲精品乱码久久久久| 91麻豆精品秘密| 夜夜嗨av一区二区三区四季av| 国产91精品免费| 国产精品电影院| 91成人免费在线视频| 中文字幕在线一区二区三区| 美女视频一区在线观看| 欧美一级免费观看| 激情文学综合插| 国产精品美女久久久久av爽李琼| 精品一区二区三区在线观看| 国产亚洲精品aa| 在线不卡欧美精品一区二区三区| 视频一区在线播放| 国产三级久久久| 欧美做爰猛烈大尺度电影无法无天| 自拍偷拍国产亚洲| 欧美精品v日韩精品v韩国精品v| 六月丁香综合在线视频| 国产精品国产三级国产a| 欧美色图天堂网| 99re亚洲国产精品| 国产传媒欧美日韩成人| 青青草原综合久久大伊人精品 | 欧美在线观看一区二区| 国产一区二区三区四区五区美女 | 51久久夜色精品国产麻豆| 国产成人在线电影| 日本aⅴ精品一区二区三区| 日本一区二区三区dvd视频在线| 欧美美女直播网站| 99在线精品免费| bt欧美亚洲午夜电影天堂| 国产日韩视频一区二区三区| 欧美电视剧免费观看| 青青草国产精品97视觉盛宴| 欧美在线观看视频一区二区| 91一区二区三区在线观看| 99天天综合性| 欧美亚男人的天堂| 欧美日韩精品一区二区三区四区 | 国产成人午夜视频| 激情久久五月天| 丝袜亚洲另类欧美| 亚洲免费观看高清在线观看| 亚洲另类中文字|