Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)詳解
什么是序列化
什么是序列化,把程序中的對(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ù)類型與通用(json)字符串之間的轉(zhuǎn)換 | dumps()、dump()、loads()、load() |
pickle | 用于實(shí)現(xiàn)Python數(shù)據(jù)類型與Python特定二進(jìn)制格式之間的轉(zhuǎn)換 | dumps()、dump()、loads()、load() |
shelve | 專門(mén)用于將Python數(shù)據(jù)類型的數(shù)據(jù)持久化到磁盤(pán),shelve是一個(gè)類似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類型,str類型 和 unicode類型 的關(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類型后,再存放到文件或者字符串中,反序列化過(guò)程 會(huì)將 json字符串 使用utf-8 編碼(encode),然后存放到內(nèi)存中的變量~
pickle模塊
用法與json類似,不過(guò)pickle不能跨語(yǔ)言,優(yōu)點(diǎn)是它支持python所有的數(shù)據(jù)類型
需要注意的是,pickle是以bytes類型來(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類型進(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)和字典類似。
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í)有所幫助,也希望大家多多支持腳本之家。
- 一文詳解python pickle中的反序列化漏洞
- Python?pickle?二進(jìn)制序列化和反序列化及數(shù)據(jù)持久化詳解
- Python Json與pickle模塊序列化使用介紹
- Python序列化模塊JSON與Pickle
- Python序列化模塊之pickle與json詳解
- Python數(shù)據(jù)序列化之pickle模塊
- Python使用pickle進(jìn)行序列化和反序列化的示例代碼
- Python序列化pickle模塊使用詳解
- Python序列化與反序列化pickle用法實(shí)例
- Python pickle模塊進(jìn)行序列化的實(shí)現(xiàn)示例
相關(guān)文章
Django中如何使用Celery執(zhí)行異步任務(wù)
這篇文章主要介紹了Django中如何使用Celery執(zhí)行異步任務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Keras之fit_generator與train_on_batch用法
這篇文章主要介紹了Keras之fit_generator與train_on_batch用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06使用tensorflow進(jìn)行音樂(lè)類型的分類
這篇文章主要介紹了使用tensorflow進(jìn)行音樂(lè)類型的分類,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08python使用循環(huán)實(shí)現(xiàn)批量創(chuàng)建文件夾示例
這篇文章主要介紹了python使用循環(huán)實(shí)現(xiàn)批量創(chuàng)建文件夾示例,需要的朋友可以參考下2014-03-03python爬蟲(chóng)刷訪問(wèn)量 2019 7月
這篇文章主要介紹了python爬蟲(chóng)刷訪問(wèn)量 2019 7月,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08對(duì)Python Pexpect 模塊的使用說(shuō)明詳解
今天小編就為大家分享一篇對(duì)Python Pexpect 模塊的使用說(shuō)明詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02