Python Json與pickle模塊序列化使用介紹
用于序列化的兩個(gè)模塊
- json,用于字符串 和 python數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換
- pickle,用于python特有的類型 和 python的數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換
Json模塊提供了四個(gè)功能:dumps、dump、loads、load
pickle模塊提供了四個(gè)功能:dumps、dump、loads、load
json.dumps 將數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換為所有程序語(yǔ)言都認(rèn)識(shí)的字符串
json.dump 將數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換為所有程序語(yǔ)言都認(rèn)識(shí)的字符串,并寫(xiě)入文件
pickle.dumps 將數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換為只有Python語(yǔ)言認(rèn)識(shí)的字符串
pickle.dump 將數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換為只有Python語(yǔ)言認(rèn)識(shí)的字符串,并寫(xiě)入文件
Json序列化舉例:
json序列化
# json是所有語(yǔ)言中都通用的,適用于不同語(yǔ)言進(jìn)行數(shù)據(jù)交互。 # 但json只能處理簡(jiǎn)單的數(shù)據(jù)類型,如果要處理復(fù)雜的,可以使用pickle # 應(yīng)用場(chǎng)景舉例:當(dāng)你使用虛擬機(jī)(或者玩游戲)時(shí),中間你突然有點(diǎn)別的事情,于是要將虛擬機(jī)掛起,以便下次使用時(shí)還是現(xiàn)在的狀態(tài)。 # 于是就用到了json,json序列化將虛擬機(jī)目前的狀態(tài)(比如進(jìn)行了什么操作,打開(kāi)了什么文件)保存在文件中, # 當(dāng)你干完別的事,再次啟動(dòng)虛擬機(jī)時(shí),json反序列化會(huì)將文件中保存的狀態(tài)從文件中讀出來(lái),于是你就可以繼續(xù)上次的操作了。 # dump和load配合使用可以實(shí)現(xiàn)序列化和反序列化, # 在Python2中可以dump很多次,也可以load很多次,他們一一對(duì)應(yīng),但是其實(shí)這沒(méi)什么意義 # 但在Python3中,可以dump很多次,但是當(dāng)dump多次時(shí),load會(huì)報(bào)錯(cuò),所以記住在Python3中永遠(yuǎn)不要dump多次 import json info = { "name":"Alex", "age":22 } with open('text.txt','w',encoding='utf-8') as f: #f.write(info) #報(bào)錯(cuò),字典不能寫(xiě)入文件中,字符串能寫(xiě)入文件中 #f.write(str(info)) #太low了 print(type(json.dumps(info))) # <class 'str'> #f.write( json.dumps(info) ) # 高級(jí)做法1 json.dump(info,f) # 高級(jí)做法2,同上
json反序列化
import json with open('text.txt','r',encoding='utf8') as f: #data=json.loads(f.read()) data=json.load(f) #同上 print(data["age"])
pickle序列化舉例:
pickle序列化
pickle寫(xiě)進(jìn)文件中的貌似是一段亂碼,其實(shí)不然,這是pickle自己的一套語(yǔ)法規(guī)則,當(dāng)然這也不是加密
pickle可以序列化所有的數(shù)據(jù)類型
但是pickle只能在Python中使用,別的語(yǔ)言不認(rèn)識(shí)它
import pickle def sayhi(name): print("Hello ",name) info = { "name":"Alex", "age":22, 'func':sayhi } with open('text2.txt','wb') as f: print(type(pickle.dumps(info))) # <class 'bytes'> f.write( pickle.dumps(info) ) # sayhi是一個(gè)內(nèi)存地址,用json序列化就寫(xiě)不到文件中,會(huì)報(bào)錯(cuò)
pickle反序列化
import pickle # def sayhi(name): # print("Hello2 ",name) with open('text2.txt','rb') as f: data=pickle.loads(f.read()) # 報(bào)錯(cuò) print(data) # data["func"]('alex') # AttributeError: Can't get attribute 'sayhi' on <module '__main__' from 'D:/python-study/s14/Day04/pickle反序列化.py'>
為什么報(bào)錯(cuò)呢?因?yàn)閟ayhi是一個(gè)內(nèi)存地址,當(dāng)pickle序列化.py程序執(zhí)行完之后,這個(gè)地址就被釋放了,當(dāng)然我們就找不到了。
這里只是想說(shuō)明一點(diǎn):pickle可以序列化所有的數(shù)據(jù)類型,不管這個(gè)數(shù)據(jù)是否可被反序列化
如果想要不報(bào)錯(cuò),可以把sayhi函數(shù)的定義拷貝過(guò)來(lái),而且還可以執(zhí)行這個(gè)函數(shù)
只要保證函數(shù)名相同就不會(huì)報(bào)錯(cuò),函數(shù)體可以完全不一樣
json模塊的作用之一:根據(jù)字符串書(shū)寫(xiě)格式,將字符串自動(dòng)轉(zhuǎn)換成相應(yīng)格式
import json # Python3.x中input方法獲取到的都是字符串,相當(dāng)于Python2.x中的raw_input inp_str = input("請(qǐng)輸入:") # 輸入一個(gè)列表,[1,2,3] print(type(inp_str)) # <class 'str'> inp_str = json.loads(inp_str,encoding="UTF-8") # 根據(jù)字符串書(shū)寫(xiě)格式,將字符串自動(dòng)轉(zhuǎn)換成 列表類型 print(type(inp_str),inp_str[0]) # <class 'list'> 1 inp_str = input("請(qǐng)輸入:") # 輸入一個(gè)字典,{"name":"Rose","age":21,"sex":"F"} # 切記,字典內(nèi)部必須是 雙引號(hào) ?。?!單引號(hào)會(huì)報(bào)錯(cuò)。 print(type(inp_str)) # <class 'str'> inp_str = json.loads(inp_str,encoding="UTF-8") # 根據(jù)字符串書(shū)寫(xiě)格式,將字符串自動(dòng)轉(zhuǎn)換成 字典類型 print(type(inp_str),inp_str['name'],inp_str['age'],inp_str['sex']) # <class 'dict'> Rose 21 F
到此這篇關(guān)于Python Json與pickle模塊序列化使用介紹的文章就介紹到這了,更多相關(guān)Python Json與pickle內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解python pickle中的反序列化漏洞
- Python?pickle?二進(jìn)制序列化和反序列化及數(shù)據(jù)持久化詳解
- Python序列化模塊JSON與Pickle
- Python序列化模塊之pickle與json詳解
- Python數(shù)據(jù)序列化之pickle模塊
- Python使用pickle進(jìn)行序列化和反序列化的示例代碼
- Python序列化pickle模塊使用詳解
- Python序列化與反序列化pickle用法實(shí)例
- Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)詳解
- Python pickle模塊進(jìn)行序列化的實(shí)現(xiàn)示例
相關(guān)文章
Python+numpy實(shí)現(xiàn)矩陣的行列擴(kuò)展方式
今天小編就為大家分享一篇Python+numpy實(shí)現(xiàn)矩陣的行列擴(kuò)展方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python實(shí)現(xiàn)的查詢mysql數(shù)據(jù)庫(kù)并通過(guò)郵件發(fā)送信息功能
這篇文章主要介紹了Python實(shí)現(xiàn)的查詢mysql數(shù)據(jù)庫(kù)并通過(guò)郵件發(fā)送信息功能,可實(shí)現(xiàn)Python針對(duì)mysql的查詢與宕機(jī)信息通過(guò)郵件發(fā)送的相關(guān)操作技巧,需要的朋友可以參考下2018-05-05國(guó)產(chǎn)化設(shè)備鯤鵬CentOS7上源碼安裝Python3.7的過(guò)程詳解
這篇文章主要介紹了國(guó)產(chǎn)化設(shè)備鯤鵬CentOS7上源碼安裝Python3.7,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05filter使用python3代碼進(jìn)行迭代元素的實(shí)例詳解
在本篇文章里小編給大家整理了關(guān)于filter使用python3代碼進(jìn)行迭代元素的實(shí)例詳解內(nèi)容,有興趣的朋友們可以參考下。2020-12-12Python獲取命令實(shí)時(shí)輸出-原樣彩色輸出并返回輸出結(jié)果的示例
今天小編就為大家分享一篇Python獲取命令實(shí)時(shí)輸出-原樣彩色輸出并返回輸出結(jié)果的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python實(shí)現(xiàn)比對(duì)美團(tuán)接口返回?cái)?shù)據(jù)和本地mongo數(shù)據(jù)是否一致示例
這篇文章主要介紹了python實(shí)現(xiàn)比對(duì)美團(tuán)接口返回?cái)?shù)據(jù)和本地mongo數(shù)據(jù)是否一致,涉及Python基于requests模塊的數(shù)據(jù)請(qǐng)求與比較運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2019-08-08Python后臺(tái)管理員管理前臺(tái)會(huì)員信息的講解
今天小編就為大家分享一篇關(guān)于Python后臺(tái)管理員管理前臺(tái)會(huì)員信息的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01python Matplotlib數(shù)據(jù)可視化(2):詳解三大容器對(duì)象與常用設(shè)置
這篇文章主要介紹了python Matplotlib三大容器對(duì)象與常用設(shè)置的相關(guān)資料,幫助大家更好的學(xué)習(xí)和使用Matplotlib庫(kù)的用法,感興趣的朋友可以了解下2020-09-09