1. 程式人生 > >python學習之-常用模組

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中型別對應