第七篇:python3 序列化
阿新 • • 發佈:2019-01-29
什麼是序列化
程式執行時所有的變數在記憶體中,在執行時如果沒有把變數變成可儲存的物件的話,程式結束後下次執行,變數依然沒有改到。所以我們需要序列化這個過程來幫助我們把執行程式時修改的變數儲存起來。簡單得說,序列化就是把變數從記憶體中變成可儲存或可傳輸的過程。當然了有序列化就有反序列化,反序列化是把變數內容從序列化的物件重新讀到記憶體裡。
python的序列化
python 中有兩種方式實現序列化,pickle
模組和json
模組。
pickle實現序列化
序列成一個bytes型別資料
pickle.dumps()
和pickle.loads()
import pickle
dict_t = dict(name='張三' ,age=18,sex='man')
print(dict_t)
# 序列化成一個bytes,然後寫入檔案
pdump = pickle.dumps(dict_t)
print(pdump)
with open('pickledumps.txt','wb') as f:
f.write(pdump)
# 讀取檔案並反序列化檔案
with open('pickledumps.txt','rb') as f:
print(pickle.loads(f.read()))
序列成一個file-like object
pickle.dump()
和pickle.load()
與上面的區別在於後面的s
import pickle
dict_t = dict(name='張三',age=18,sex='man')
print(dict_t)
#序列化成file-like object,直接寫入檔案
with open('pickledump.txt','wb') as f:
pickle.dump(dict_t,f)
#反序列化,讀取資料
with open('pickledump.txt','rb') as f:
print('this is pickle file:\n',pickle.load(f))
json實現序列化
序列成一個str型別資料
import json
dict_t = dict(name='李四',age=18,sex='man')
print(dict_t)
# 序列化dumps()返回一個str,寫入檔案
json_d = json.dumps(dict_t)
with open('jsondumps.txt','w') as f:
f.write(json_d)
with open('jsondumps.txt','r') as f:
print(json.loads(f.read()))
序列成一個file-like object
import json
dict_t = dict(name='李四',age=18,sex='man')
print(dict_t)
# 序列化dump()返回一個file-like object,直接寫入檔案
with open('jsondump.txt','w') as f:
json_d = json.dump(dict_t,f)
# 反序列化load()從file-like Object中讀取字串並反序列化
with open('jsondump.txt','r') as f:
print(json.load(f))
類的序列化
我們時常用到的是類的序列化,但是類的物件不可以直接用json.dump()
序列化,但json.dump()
函式為我們提供定製功能,在函式呼叫時參入引數即可,引數是將類裡面的資料返回成一個dict
型別。
比如可以這樣寫:
json.dumps(s, default=lambda obj: obj.__dict__)
反序列化也是同樣的道理,可以寫一個函式,將dict
轉換為類例項。