亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)詳解

系統(tǒng) 1661 0

什么是序列化

什么是序列化,把程序中的對(duì)象或者變量,從內(nèi)存中轉(zhuǎn)換為可存儲(chǔ)或可傳輸?shù)倪^(guò)程稱為序列化。在 Python 中,這個(gè)過(guò)程稱為 pickling,在其他語(yǔ)言中也被稱為 serialization,marshalling,flattening 等。程序中的對(duì)象(或者變量)在序列化之后,就可以直接存放到存儲(chǔ)設(shè)備上,或者直接發(fā)送到網(wǎng)絡(luò)上進(jìn)行傳輸。

序列化的逆向過(guò)程,即為反序列化(unpickling),就是把序列化的對(duì)象(或者變量)重新讀到內(nèi)存中~

Python中序列化的模塊

模塊名稱 描述 提供的api
json 用于實(shí)現(xiàn)Python數(shù)據(jù)類(lèi)型與通用(json)字符串之間的轉(zhuǎn)換 dumps()、dump()、loads()、load()
pickle 用于實(shí)現(xiàn)Python數(shù)據(jù)類(lèi)型與Python特定二進(jìn)制格式之間的轉(zhuǎn)換 dumps()、dump()、loads()、load()
shelve 專門(mén)用于將Python數(shù)據(jù)類(lèi)型的數(shù)據(jù)持久化到磁盤(pán),shelve是一個(gè)類(lèi)似dict的對(duì)象,操作十分便捷 open()

json模塊

大部分編程語(yǔ)言都會(huì)提供處理json數(shù)據(jù)的接口,Python 2.6開(kāi)始加入了json模塊,且把它作為一個(gè)內(nèi)置模塊提供,無(wú)需下載即可使用。

json支持的數(shù)據(jù)格式有限,有int str list dict以及特殊的tuple(會(huì)將tuple轉(zhuǎn)為list)

Json模塊提供了四個(gè)功能:dumps、dump、loads、load

dumps和loads主要是在內(nèi)存內(nèi)操作,如下:

            
import json 
 list = ['a','b','c'] 
 list_str = json.dumps(list)
 print(list_str)   #["a", "b", "c"] 
 list2 = json.loads(list_str)
 print(list2)    #['a', 'b', 'c']
          

而dump和load是從文件內(nèi)操作,如下:

            
import json
 list = ['a','b','c']
 with open('test','w',encoding='utf-8') as f:
   json.dump(list,f) 
 with open('test','r',encoding='utf-8') as f2:
   json.load(f2)
          

json模塊中的字符編碼問(wèn)題

在Python3中,代碼中的字符串都是使用 unicode 格式存放的,序列化之后也是以u(píng)nicode 格式存放,所以序列化和反序列化過(guò)程都不存在問(wèn)題。

Python2中,代碼中的字符串是 str類(lèi)型,str類(lèi)型 和 unicode類(lèi)型 的關(guān)系如下所示:

unicode -----> encode --------> str(例如為 utf-8編碼)

utf-8(例如為 utf-8編碼) --------> decode ----------> unicode

所以在Python2中,序列化過(guò)程和反序列化過(guò)程都有涉及到轉(zhuǎn)碼過(guò)程(encode和decode),序列化過(guò)程 會(huì)先將對(duì)象中的字符串 使用utf-8 進(jìn)行解碼(decode),轉(zhuǎn)換為unicode類(lèi)型后,再存放到文件或者字符串中,反序列化過(guò)程 會(huì)將 json字符串 使用utf-8 編碼(encode),然后存放到內(nèi)存中的變量~

pickle模塊

用法與json類(lèi)似,不過(guò)pickle不能跨語(yǔ)言,優(yōu)點(diǎn)是它支持python所有的數(shù)據(jù)類(lèi)型

需要注意的是,pickle是以bytes類(lèi)型來(lái)進(jìn)行序列化的

            
import pickle
 list = ['a','b','c']
 list_str = pickle.dumps(list)
 print(list_str)     #b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.'
 
 list2 = pickle.loads(list_str)
 print(list2)      #['a', 'b', 'c']
          

而正因?yàn)閜ickle是以bytes類(lèi)型進(jìn)行序列化的,所以在用dump和load方法對(duì)文件進(jìn)行寫(xiě)入或者反序列化的時(shí)候,要以wb或者rb模式打開(kāi),如下:

            
import pickle
 list = ['a','b','c']
 with open('test','wb') as f:
   pickle.dump(list,f) 
 with open('test','rb') as f2:
   pickle.load(f2)
          

shelve模塊

shelve也是python提供給我們的序列化工具,比pickle用起來(lái)更簡(jiǎn)單一些。 shelve只提供給我們一個(gè)open方法,是用key來(lái)訪問(wèn)的,使用起來(lái)和字典類(lèi)似。

            
import shelve
 f = shelve.open('test1')
 f['key'] = {'a':1, 'b':2, 'c':'sss'} #直接對(duì)文件句柄操作,就可以存入數(shù)據(jù)
 f['key2'] = {'d':3, 'e':4, 'f':'ddd'}
 f.close()
 f1 = shelve.open('test1')
 dic1 = f1['key'] #取出數(shù)據(jù)的時(shí)候也只需要直接用key獲取即可,但是如果key不存在會(huì)報(bào)錯(cuò)
 dic2 = f1['key2']
 f1.close()
 print(dic1)
 print(dic2)
          

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 九九综合 | 综合色伊人 | 中文字幕在线高清 | 国产精品中文字幕在线 | 香蕉视频网站在线观看 | 国产成人aa在线观看视频 | 国产第一福利影院 | 精品国产第一国产综合精品gif | 久久中文字幕综合婷婷 | 日本一级毛片毛片一级毛片 | 狠狠综合久久久久尤物丿 | 草草草在线观看 | 天天在线干 | 加勒比一本大道在线 | 久久免费视频8 | 夜夜摸天天操 | 久色视频在线观看 | 亚洲精彩视频在线观看 | 欧美日韩在大午夜爽爽影院 | 久久精品亚洲一区二区三区浴池 | 婷婷色九月综合激情丁香 | 美女在线视频观看影院免费天天看 | 国产精品二区高清在线 | 久久婷婷激情综合中文字幕 | 老司机福利深夜亚洲入口 | 天天躁日日2018躁狠狠躁 | 九九视频精品全部免费播放 | 日本免费一区二区三区在线看 | 三极毛片 | 99久久精品久久久久久婷婷 | 日日摸夜夜爽夜夜爽出水 | 久久r8这里只精品99re66 | 亚洲国产成人久久精品动漫 | 中文字幕欧美日韩在线不卡 | 日韩欧美国产偷亚洲清高 | 亚洲一区二区欧美日韩 | 久久影| 天天干夜夜夜操 | 中国护士一级毛片免费版本 | 印度老妇bbwfreexxx | 伊人网站在线观看 |