python序列化pickle模組和json模組簡單學習
序列化:把變數從記憶體中變成可儲存或傳輸的過程,在Python中叫pickling,在其他語言中也被稱serialization,marshalling,flattening等等
反序列化:把變數內容從序列化的物件重新讀到記憶體裡
pcikel模組實現序列化
函式介紹:
pickel.dumps() 將一個物件序列化為一個bytes
pickle.dump() 直接吧物件序列花並寫入一個file-like object
pickle.loads() 將bytes反序列化為一個物件
pickle.load() 直接從一個file-like object反序列化出物件
簡單程式碼例項
#pickle模組的序列化,pickle序列化時是得到一個bytes
import pickle
d = dict(name='duan',age=45)
#利用pickle.dumps並寫入檔案
b = pickle.dumps(d) #序列化為bytes
f = open('se.txt','wb')
f.write(b)
f.close()
#利用pickle.dump直接吸入一個file-like object
f = open('se.txt','wb')
pickel.dump(d,f)
f.close()
#反序列化,利用pickle.loads
f = open ('se.txt','rb')
bs = f.read()
print(pickle.loads(bs))
f.close()
#反序列化,利用pickle.load直接反序列化一個file-like object
f = open('se.txt','rb')
print(pickle.load(f))
f.close()
json模組實現序列化和反序列化
json和python內建資料型別對應關係:
JSON型別 Python型別
{} dict
[] list
“string” str
1234.56 int或float
true/false True/False
null None
函式介紹:
json.dumps() 將一個物件序列化為一個str
json.dump() 直接吧物件序列花並寫入一個file-like object
json.loads() 將json str反序列化為一個物件
json.load() 直接從一個file-like object反序列化出物件
簡單程式碼例項
說明:
例項中包括dict的序列化反序列化和class例項的序列化和反序列化;
對於class例項在序列化時需要傳入default引數,用來實現class例項和dict的轉化,此處因為所有例項都有一個dict屬性,所以可以用lambda表示式如下,序列化的過程為先吧class例項轉化為dict,再序列化;
在反序列化時需要先序列化為dict,再用object_hook引數傳入的轉化函式將dict轉化為class例項。
#json序列化,json序列化為一個str
import json
d = dict(name='bob',age =23)
#利用json.dumps序列化並寫入一個檔案
f = open('json.txt','w')
jt = json.dumps(d)
f.write(jt)
f.close()
#利用json.dump直接序列化寫入一個file-like object
f = open('json.txt','w')
json.dump(d,f)
#利用json.loads()反序列化得到一個dict
f = open('json.txt','r')
print(json.loads(f.read()))
f.close()
#利用json.load()直接反序列化一個file-like object
f = open('json.txt','r')
print(json.load(f))
f.close()
#實現class例項的序列化和反序列
import json
class Student(object):
def __init(self,name,age):
self.name = name
self.age = age
#在實現序列化時我們需要定義一個轉化函式,將class例項轉化為dict在序列化
def student2dict(obj):
return {
'name':obj.name,
'age':obj.age
}
#在反序列化先反序列化為一個dict,同時我們也需要一個函式,將dict轉化為class例項
def dict2student(di):
reutrn Student(di['name'],di['age'])
#序列化
s = Student('bob',23)
print(json.dumps(s,default=student2dict))
#對於序列化時的轉化函式,由於class例項都有一個__dict__屬性,記錄例項變數故
print(json.dumps(s,defailt= lambda obj:obj.__dict__))
#反序列化
json_str='{"name":"bob","age":23}'
print(json.loads(json_str,object_hook=dict2student))