最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python文件的應(yīng)用之序列化與反序列化詳解

 更新時(shí)間:2022年03月25日 08:31:29   作者:渴望力量的哈士奇  
為了簡化數(shù)據(jù)類型的寫入和獲取,今天我們來學(xué)習(xí)一個(gè)新的知識(shí)點(diǎn)——序列化。通過學(xué)習(xí)序列化,可以不必過分擔(dān)心寫入文件的數(shù)據(jù)類型是什么,并且讀取文件也可以非常輕松的還原數(shù)據(jù)類型。感興趣的可以了解一下

前面章節(jié)我們學(xué)些了文件對(duì)象的創(chuàng)建、寫入與讀取,并且針對(duì) .py 文件 與 .txt 文件進(jìn)行了有針對(duì)性的小練習(xí)。 通過前面的學(xué)習(xí)我們知道,文件對(duì)象的讀寫只能進(jìn)行 字符串 或 byte 類型的操作,其他類型只能通過格式化存儲(chǔ)或者數(shù)據(jù)類型的轉(zhuǎn)換才能實(shí)現(xiàn)。

但無論是哪一種,從文件中讀取數(shù)據(jù)后都需要進(jìn)行比較復(fù)雜的處理才能還原到原始的數(shù)據(jù)類型。為了簡化數(shù)據(jù)類型的寫入和獲取,今天我們來學(xué)習(xí)一個(gè)新的知識(shí)點(diǎn) —> 序列化。

通過學(xué)習(xí)序列化,可以不必過分擔(dān)心寫入文件的數(shù)據(jù)類型是什么,并且讀取文件也可以非常輕松的還原數(shù)據(jù)類型。[比較討厭這種每章之前寫概述、摘要的短句。]

初識(shí)序列化與反序列化

什么是序列化?

通俗一點(diǎn)來說,序列化就是將 對(duì)象的信息 或者 數(shù)據(jù)結(jié)構(gòu)的信息 通過一定的規(guī)則進(jìn)行轉(zhuǎn)換,可以達(dá)到 文件存儲(chǔ) 或 網(wǎng)絡(luò)傳輸 的效果。通過前面章節(jié)的學(xué)習(xí),我們知道如果要進(jìn)行存儲(chǔ)或網(wǎng)絡(luò)傳輸,最終的數(shù)據(jù)類型都是 字符串,而且這些字符串還需要是有一定規(guī)則的字符串。

而我們今天要學(xué)習(xí)的 內(nèi)置模塊 ---> json 可以用于文件存儲(chǔ)或者網(wǎng)絡(luò)傳輸,這也是序列化的作用。

而反序列化就是通過序列化規(guī)則生成的字符串再反轉(zhuǎn)為原始的數(shù)據(jù)類型,這就是反序列化。

這里我們可以引入 字符串 與 byte 之間的轉(zhuǎn)換來理解 序列化與反序列化, 字符串與 byte 類型之間互相轉(zhuǎn)換常用的 encode() 函數(shù)、與 decode() 函數(shù),分別代表著編碼與解碼,所以有編碼,就一定有解碼 。套用在序列化來理解,既然存在序列化,那么就肯定有對(duì)應(yīng)的反序列化哈。

可序列化的數(shù)據(jù)類型

哪些數(shù)據(jù)類型是可以序列化,哪些又是不可以序列化的呢?

可序列化:number、str、list、tuple、dict [字典是最常用的序列化數(shù)據(jù)類型]

不可序列化:class 、def (函數(shù)與實(shí)例化對(duì)象)、set 是無法進(jìn)行序列化的

Python 中的json

json模塊是一個(gè)通用的序列化模塊,通過它可以完成通用化的序列化與反序列化操作。為什么說是通用的,那是因?yàn)閹缀跛械木幊陶Z言都有json模塊,而且他們序列化與反序列化的規(guī)則是統(tǒng)一的。

所以我們?cè)?Python 中序列化的內(nèi)容,在任意其他編程語言中都可以進(jìn)行反序列化并使用原始的數(shù)據(jù),這就是通用的意思。

dumps() 與 loads() 函數(shù)

json 中最重要的函數(shù) - 就是 dumps() 與 loads() 函數(shù)

方法名參數(shù)介紹舉例返回值
dumpsobj對(duì)象序列化json.dumps([1, 2, 3])字符串
loadsstr反序列化Json.loads(’[1, 2, 3]’)原始數(shù)據(jù)類型

可序列化數(shù)據(jù)類型演示案例

演示案例如下:

import json


int_test = 666				# 定義 整型、字符串、列表、元組、字典 五種數(shù)據(jù)類型 ,用于序列化測(cè)試
str_test = 'test_string'
list_test = [1, 2, 3]
tuple_test = (4, 5, 6)
dict_test = {'Name': '托尼.史塔克', 'Sex': '男'}


int_test_json = json.dumps(int_test)		# 將上文中五種數(shù)據(jù)類型進(jìn)行序列化操作
str_test_json = json.dumps(str_test)
list_test_json = json.dumps(list_test)
tuple_test_json = json.dumps(tuple_test)
dict_test_json = json.dumps(dict_test)

在 Treminal 終端 執(zhí)行上述測(cè)試腳本,如下圖:

這里我們重點(diǎn)介紹一下 字典類型的序列化結(jié)果

In [7]: dict_test_json
Out[7]: '{"Name": "\\u6258\\u5c3c.\\u53f2\\u5854\\u514b", "Sex": "\\u7537"}'

從執(zhí)行結(jié)果我們可以看出字典類型的數(shù)據(jù)類型,經(jīng)過序列化后。字典變成了字符串的同時(shí),且字典內(nèi)的 單引號(hào) 變成了 雙引號(hào),中文也變成了比特類型,并且進(jìn)行了 encode 。(這是序列化的一個(gè)標(biāo)準(zhǔn))

為什么我們說 字典類型是非常是和序列化的呢?實(shí)際上 json 并不僅僅是一個(gè)標(biāo)準(zhǔn),也是一種文件格式。比如我們編寫腳本的 .py 格式的文件,就是 python 文件容器;.txt 格式的文件是普通的文本文件容器;同樣的,.json 格式的文件也是文件容器,json 文件存儲(chǔ)的樣式(格式)就是字典類型的序列化格式。

接下來我們?cè)賴L試將上文的五種測(cè)試數(shù)類型反序列化處理,看看結(jié)果會(huì)怎樣?

_int_test_json = json.loads(int_test_json)
_str_test_json = json.loads(str_test_json)
_list_test_json = json.loads(list_test_json)
_tuple_test_json = json.loads(tuple_test_json)
_dict_test_json = json.loads(dict_test_json)

在 Treminal 終端 執(zhí)行上述測(cè)試腳本,如下圖:

劃重點(diǎn):元組類型經(jīng)過序列化處理后再通過反序列化還原數(shù)據(jù)時(shí),會(huì)變?yōu)榱斜頂?shù)據(jù)類型。這是因?yàn)?元組類型 是 python 語言中特有的數(shù)據(jù)類型,json 作為一個(gè)通用格式,無法識(shí)別元組類型。所以在針對(duì)元組類型進(jìn)行序列化的時(shí)候,會(huì)先將 元組類型 ,先轉(zhuǎn)為 列表,再進(jìn)行序列化處理;同樣的在進(jìn)行反序列化處理時(shí),就會(huì)將序列化后的 元組類型 ,又轉(zhuǎn)成了 列表類型 。(類型的轉(zhuǎn)換,不影響對(duì)數(shù)據(jù)的使用)

bool 、None 類型的序列化與反序列化

示例如下:

print(json.dumps(True))
# >>> 輸出結(jié)果:true

print(json.dumps(False))
# >>> 輸出結(jié)果:false

print(json.dumps(None))
# >>> 輸出結(jié)果:null

從上述運(yùn)行結(jié)果來看,bool 類型經(jīng)過序列化處理后,變成了小寫的 true、false;而 None 類型則變成了 小寫的 null 。

之所以會(huì)這樣,是因?yàn)樵诖蠖鄶?shù)的編程語言中, bool 類型都是小寫的 true、false 。json 作為一個(gè)通用的序列化模塊,也同樣遵循著這種規(guī)則。(小寫的 true、false 依然是字符串類型。 )

接下來我們?cè)賹⑸鲜龅男蛄谢幚砗蟮?bool 、None 類型 進(jìn)行反序列化處理

print(json.loads(json.dumps(None)))
# >>> 輸出結(jié)果:None

print(json.loads(json.dumps(True)))
# >>> 輸出結(jié)果:True

print(json.loads(json.dumps(False)))
# >>> 輸出結(jié)果:False

從執(zhí)行結(jié)果我們看到,經(jīng)過反序列化之后,bool、None 類型又被還原成了 python 可讀的狀態(tài)。

Python 中的pickle

pickle模塊與json模塊一樣可以進(jìn)行序列化與反序列化,區(qū)別在于 pickle 是 Python 內(nèi)置的序列化模塊,而且不像 json 那么通用,它只能用于 python 自身來使用,其他語言可能就無法處理了,但pickle模塊的性能是要比 json 更好的。如果是僅僅用于 python 自身來使用,pckle 模塊還是一個(gè)挺不錯(cuò)的選擇哦。

dumps() 與 loads() 函數(shù)

方法名參數(shù)介紹舉例返回值
dumpsobj對(duì)象序列化json.dumps([1, 2, 3])比特
loadsstr反序列化Json.loads(’[1, 2, 3]’)原始數(shù)據(jù)類型

注意:區(qū)別于 json ,pickle 模塊的 dumps() 函數(shù) 返回的是 byte 類型 ,而 loads() 函數(shù)也僅支持 byte 類型的 pickle 序列進(jìn)行反序列化的操作。

pickle模塊的序列化與反序列化練習(xí)

pickle模塊與json模塊的用法是完全一致的,這里我們就不過多的演示,只針對(duì) dict 類型演示一下即可。

json 模塊 - 序列化小實(shí)戰(zhàn)

需求:

創(chuàng)建一個(gè) test.json 的空文件。

定義一個(gè) write 函數(shù)寫入 dict 數(shù)據(jù)類型的內(nèi)容到 test.json 文件

定義一個(gè) read 函數(shù),將寫入到 test.json 文件的內(nèi)容,反序列化讀取出來

# coding:utf-8

import json


data = {'name': '托尼·史塔克', 'age': 52, 'top': 185}

def read(path):                 # 定義 read() 函數(shù),讀取 test.json 文件(返回對(duì)象為 反序列化后的內(nèi)容)
    with open(path, 'r') as f:
        data = f.read()

    return json.loads(data)

def write(path, data):          # 定義 write() 函數(shù),將 data 寫入到 test.json 文件
    with open(path, 'w') as f:
        if isinstance(data, dict):      # 判斷 data 是否為字典類型。不是的情況下主動(dòng)拋出異常
            _data = json.dumps(data)
            f.write(_data)
        else:
            raise TypeError('\'data\' 不是一個(gè)字典類型的數(shù)據(jù)')
    return True


if __name__ == '__main__':
    write('test.json', data)
    result = read('test.json')
    print(result)
    result['Sex'] = 'Man'           # 加入 {'Sex': 'Max'} 鍵值對(duì)
    write('test.json', result)      # 將加入的 鍵值對(duì) 寫入 test.json 文件
    result_test_json = read('test.json')
    print(result_test_json)

執(zhí)行結(jié)果如下:

總結(jié):json的使用在我們的未來 工作中是非常高頻的,所以大家一定要多多練習(xí),加以掌握。

到此這篇關(guān)于Python文件的應(yīng)用之序列化與反序列化詳解的文章就介紹到這了,更多相關(guān)Python文件序列化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python爬蟲實(shí)戰(zhàn)之爬取京東商城實(shí)例教程

    python爬蟲實(shí)戰(zhàn)之爬取京東商城實(shí)例教程

    這篇文章主要介紹了python爬取京東商城的相關(guān)資料,文中通過爬取一個(gè)實(shí)例頁面進(jìn)行了講解,通過示例代碼和圖文介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • python簡單實(shí)現(xiàn)矩陣的乘,加,轉(zhuǎn)置和逆運(yùn)算示例

    python簡單實(shí)現(xiàn)矩陣的乘,加,轉(zhuǎn)置和逆運(yùn)算示例

    這篇文章主要介紹了python簡單實(shí)現(xiàn)矩陣的乘,加,轉(zhuǎn)置和逆運(yùn)算,結(jié)合實(shí)例形式分析了Python針對(duì)矩陣的乘,加,轉(zhuǎn)置和求逆等運(yùn)算相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • python生成驗(yàn)證碼圖片代碼分享

    python生成驗(yàn)證碼圖片代碼分享

    這篇文章主要為大家介紹了python生成驗(yàn)證碼圖片代碼,生成原理是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一些干擾象素,想要實(shí)現(xiàn)驗(yàn)證碼圖片的朋友可以參考一下
    2016-01-01
  • Python獲取時(shí)間戳的多種方法總結(jié)

    Python獲取時(shí)間戳的多種方法總結(jié)

    時(shí)間戳是一個(gè)表示日期和時(shí)間的數(shù)值,通常以秒為單位,在Python中,獲取時(shí)間戳是常見的任務(wù),用于記錄事件、計(jì)時(shí)操作、以及在各種應(yīng)用中跟蹤時(shí)間,本文將介紹多種獲取時(shí)間戳的方法,包括標(biāo)準(zhǔn)庫和第三方庫的方式,并提供示例代碼以幫助你更好地理解
    2023-11-11
  • Python中操作mysql的pymysql模塊詳解

    Python中操作mysql的pymysql模塊詳解

    這篇文章給大家演示了如何安裝以及使用Python中操作mysql的pymysql模塊,本文介紹的很詳細(xì),對(duì)大家學(xué)習(xí)Python具有一定參考借鑒價(jià)值,有需要的朋友們一起來看看吧。
    2016-09-09
  • Python辦公自動(dòng)化之CSV文件的運(yùn)用和管理

    Python辦公自動(dòng)化之CSV文件的運(yùn)用和管理

    Python辦公?動(dòng)化是利?Python編程語?來創(chuàng)建腳本和程序,以簡化、加速和?動(dòng)化?常辦公任務(wù)和?作流程的過程,本文主要來介紹一下如何利用Python進(jìn)行CSV文件的運(yùn)用和管理,感興趣的可以了解下
    2023-12-12
  • Python實(shí)現(xiàn)桌面翻譯工具【新手必學(xué)】

    Python實(shí)現(xiàn)桌面翻譯工具【新手必學(xué)】

    這篇文章主要介紹了Python實(shí)現(xiàn)一個(gè)桌面翻譯工具,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python文件操作之二進(jìn)制文件詳解

    Python文件操作之二進(jìn)制文件詳解

    下面小編就為大家?guī)硪黄褂肞ython文件操作之二進(jìn)制文件。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • 使用Python計(jì)算TRC20地址

    使用Python計(jì)算TRC20地址

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)計(jì)算TRC20地址,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Python第三方庫OS庫方法實(shí)操

    Python第三方庫OS庫方法實(shí)操

    這篇文章主要給大家介紹了關(guān)于Python第三方庫OS庫的相關(guān)資料,os庫主要是對(duì)文件和文件夾進(jìn)行操作,在Python中對(duì)?件和?件夾的操作要借助os模塊??的相關(guān)功能,需要的朋友可以參考下
    2024-06-06

最新評(píng)論

甘谷县| 龙井市| 太原市| 霸州市| 文水县| 治县。| 宜丰县| 米泉市| 柳林县| 永安市| 南部县| 灵璧县| 旺苍县| 林周县| 五大连池市| 林口县| 和政县| 浪卡子县| 保德县| 枣庄市| 周至县| 弋阳县| 滕州市| 铜陵市| 玉溪市| 八宿县| 九台市| 治多县| 文山县| 星座| 湖北省| 湘阴县| 金沙县| 泗阳县| 灌云县| 清水河县| 洞口县| 平凉市| 留坝县| 饶阳县| 凤山县|