python學習之-常用模組
json 和pickle 模組
json和pickle模組下都有4個功能
dumps <---> loads (序列化 <--->反序列化)
dump <---> load (簡單寫法序列化<---> 簡單寫法反序列化)
用途:序列化模組
什麼是序列化
序列化就是把記憶體中資料型別轉換成一種可以儲存到硬碟/基於網路傳輸的中間格式
反序列化就是將中間格式轉成相對應的資料型別
PS:不同平臺的資料型別是無法識別的,如果資料要誇平臺互動,被其他平臺識別,那就要把資料序列化後傳輸到其他平臺,然後該平臺再反序列後即可讀取
PS:序列化寫入的檔案是什麼型別,反序列化出來就是什麼型別
為何要序列化
1. 持久儲存狀態
2. 資料跨平臺互動
如何序列化
json:
優點: 是一種通用的格式
缺點: 只能識別部分python資料型別(dict、list、str、int、float、True\False、None)
PS:json是開發運維中常用模式,而且json只能識別雙引號 “ ”
pickle:
優點: 可以識別所有python的資料型別
缺點: 只能被python識別
序列化例項import json序列化
將序列化的結果寫入檔案
dic={'user':'egon','age':18}
res=json.dumps(dic)
with open('a.json',mode='wt',encoding='utf-8') as f:
f.write(res)
PS:用json模組將字典轉換成json格式寫入檔案這就是一個序列化過程
PS:序列化寫入的檔案可以使txt檔案,也可以是json字尾的檔案
從檔案中讀取內容轉換成相關的格式
with open('a.json',mode='rt',encoding='utf-8') as f:
dic=json.loads(f.read())
print(dic,dic['user'])
序列化並且寫入檔案(簡寫法)
dic={'user':'egon','age':18}
with open('b.json',mode='wt',encoding='utf-8') as f:
json.dump(dic,f) #這一步就是先把dic做了json.dumps,然後執行了f.read(),最後把內容寫入檔案
反序列化讀取檔案(簡寫法)
with open('b.json',mode='rt',encoding='utf-8') as f:
res= json.load(f) #這一步就是先執行了f.read(),然後執行了json.load反序列化操作
print(res)
eval內建函式(無法用作反序列化)
原理就是把python中內建表示式執行一下,什麼是python內建表示式,就是如1+2python中會得到一個3,所以做了加法運算,又如[1,2,3],python中會得到一個liest
with open('c.txt',mode='rt',encoding='utf-8') as f:
dic_str=f.read()
dic=eval(dic_str)
print(dic['aaa'])
PS:由於eval轉換隻是把檔案的內容讀取然後用python直譯器執行,並沒有做任何平臺型別對應的反序列化,單純的把表示式拿出來執行,所以會報錯,導致讀取的程式碼無法執行
pickle序列化與反序列化
json.dumps({1,2,3,})
import pickle
s={1,2,3}
res=pickle.dumps(s)
print(res,type(res))
with open('e.pkl',mode='wb') as f:
f.write(res)
PS:pickle序列化是將檔案轉成二進位制,讀取時候一定要以b模式讀取
pikle模組反序列化
with open('e.pkl',mode='rb') as f:
data=f.read()
res=pickle.loads(data)
print(res,type(res))
JSON和Python中型別對應