新聞中心
程序運行時,所有的變量都儲存在內(nèi)存中,程序結(jié)束運行時,這些占用的內(nèi)存將被系統(tǒng)回收,無法長期儲存,將這些變量轉(zhuǎn)換為可儲存或可通過網(wǎng)絡(luò)傳輸?shù)倪^程稱之為序列化(pickling),序列化后就可以將它們儲存在磁盤或通過網(wǎng)絡(luò)進行傳輸。

創(chuàng)新互聯(lián)建站成立于2013年,我們提供高端成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)站定制、營銷型網(wǎng)站建設(shè)、微信小程序開發(fā)、微信公眾號開發(fā)、成都網(wǎng)站營銷服務(wù),提供專業(yè)營銷思路、內(nèi)容策劃、視覺設(shè)計、程序開發(fā)來完成項目落地,為成都PVC花箱企業(yè)提供源源不斷的流量和訂單咨詢。
1.pickle序列化
python提供了pickle模塊來實現(xiàn)變量的序列化,這個模塊可以將變量轉(zhuǎn)換成字節(jié)碼(bytes)形式儲存,還能將儲存的序列化字節(jié)碼重新還原成數(shù)據(jù)對象;
注意:pickle僅能用于python程序之間交換數(shù)據(jù),且不同的版本之間并不兼容,需要和其他程序進行通信時,請使用json序列化,它可以在不同編程語言間共享數(shù)據(jù)。
a.pickle普通對象序列化
先來看一個小實例,使用pickle模塊,將幾個不同的對象序列化,這些序列化后的對象可用于網(wǎng)絡(luò)傳輸或儲存到磁盤文件中:
#!/usr/bin/env python3
#coding=utf-8
import os
import pickle
#創(chuàng)建一個字典對象和一個字符串對象
d=dict(one=1,two=2,three=3)
s="python"
print(d) #輸出{'three': 3, 'two': 2, 'one': 1}
print(s) #輸出
#將這兩個對象序列化,nd和ns僅保存在內(nèi)存中,可用于網(wǎng)絡(luò)傳輸
nd=pickle.dumps(d)
ns=pickle.dumps(s)
print(nd) #輸出字節(jié)碼"b'\x80\x03}q\x00...."
print(ns) #輸出字節(jié)碼"b'\x80\x03X\x11...."
#將序列化后的對象重新還原成數(shù)據(jù)(假設(shè)接收端接收到這些數(shù)據(jù)后,就能夠這樣還原)
nd=pickle.loads(nd)
ns=pickle.loads(ns)
print(nd) #輸出{'three': 3, 'two': 2, 'one': 1}
print(ns) #輸出
#創(chuàng)建一個文件testfile,接收字節(jié)碼(wb),將d對象中的數(shù)據(jù)寫入其中,
#用于本地不同應(yīng)用程序之間數(shù)據(jù)交換(此時如果我們打開testfile文件,
#就會看到一些類似亂碼一樣的字符,實際上是d對象序列化后的數(shù)據(jù))
with open("testfile","wb") as f1:
pickle.dump(d,f1)
#從testfile文件中讀取字節(jié)碼,還原成數(shù)據(jù)
if os.path.isfile("testfile"):
with open("testfile","rb") as f2:
print(f2.read()) #輸出"b'\x80\x03}q\x0...."
#因為上一步讀取了數(shù)據(jù),指針位置要重新設(shè)置成起始位置,
#這僅僅是為了演示給大家看,上面print和seek這兩句可以不寫
f2.seek(0)
d=pickle.load(f2) #讀取f2中的數(shù)據(jù)還原
print(d) #輸出{'three': 3, 'two': 2, 'one': 1}總結(jié):僅在內(nèi)存中序列化和還原,使用dumps()和loads(),要將數(shù)據(jù)序列化后保存到文件中使用dump(),從文件中還原數(shù)據(jù)使用load(),兩者只有一個s的區(qū)別,注意不要混淆。
b.pickle類序列化
有時候我們可能要傳輸或保存一個類對象與其中所有的數(shù)據(jù),python中實現(xiàn)類的序列化十分簡單,與對象序列化沒有什么區(qū)別,請看下面的實例:
#!/usr/bin/env python3
#coding=utf-8
import pickle
########
class A:
#--------
def __init__(self,name="py",website="python"):
self.name=name
self.website=website
x=A()
x.name="晴刃"
#序列化類實例x,可用于網(wǎng)絡(luò)傳輸
nx=pickle.dumps(x)
print(nx) #輸出"b'\x80\x03c__main__...."
#還原數(shù)據(jù)
nx=pickle.loads(nx)
print(nx) #輸出"<__main__.A object at 0x7f43c995c080>"
#將類對象序列化后保存到磁盤文件中,可用于程序間數(shù)據(jù)交換
with open("testfile","wb") as f1:
pickle.dump(x,f1)
#讀取文件中的數(shù)據(jù)還原
with open("testfile","rb") as f1:
y=pickle.load(f1)
print(y.name) #輸出"晴刃"
print(y.website) #輸出2.json序列化
如果要在不同的編程語言之間傳遞對象,可以使用python的json模塊對數(shù)據(jù)進行序列化,json序列化后所有數(shù)據(jù)都被表示成字符串形式,可以被所有語言讀取,也可以方便地存儲到磁盤或者通過網(wǎng)絡(luò)傳輸,但在類數(shù)據(jù)轉(zhuǎn)換時會稍微有點麻煩,沒有pickle那么方便。
a.json普通對象序列化
#!/usr/bin/env python3 #coding=utf-8 import json #創(chuàng)建一個字典對象和一個浮點數(shù)對象 d=dict(one=1,two=2,three=3) f=3.14 print(type(d)) #print(type(f)) # #普通對象的序列化與pickle相同 nd=json.dumps(d) nf=json.dumps(f) #轉(zhuǎn)換后所有對象都變成了字符串類型 print(type(nd)) print(type(nf)) print(nd) #"{"three": 3, "two": 2, "one": 1}" print(nf) #"3.14" #還原數(shù)據(jù) nd=json.loads(nd) nf=json.loads(nf) print(type(nd)) # print(type(nf)) # #將d對象序列化后儲存到testfile文件中 with open("testfile","w") as f1: json.dump(d,f1) #從testfile文件中讀取數(shù)據(jù)并還原 with open("testfile","r") as f1: y=json.load(f1) print(type(y)) #
b.json類序列化
使用json序列化類會稍顯復(fù)雜,因為json的dump方法不知道如何將一個類轉(zhuǎn)換成字符串,需要我們自己指定一個轉(zhuǎn)換函數(shù),請看下面的實例:
#!/usr/bin/env python3
#coding=utf-8
import json
class A(object):
def __init__(self,name="py",website="python"):
self.name=name
self.website=website
#初始化一個類實例
a=A()
#創(chuàng)建一個函數(shù),將類A中的對象和數(shù)據(jù)轉(zhuǎn)換成字典的形式返回
def classA2dict(c):
return {"name":c.name,"website":c.website}
#將a使用json序列化,參數(shù)default告訴python解釋器,將前面的對象a傳遞給后面的classA2dict函數(shù)處理,
#classA2dict函數(shù)會返回一個字典類型,這個類型中包含了實例a中所有對象和數(shù)據(jù)的"鍵值對",
#然后dumps函數(shù)將這個返回的字典類型序列化成字符串類型
x=json.dumps(a,default=classA2dict)
#如果想偷懶不寫classA2dict函數(shù),有一種簡便方法,使用匿名函數(shù),并且調(diào)用基類的__dict__函數(shù),
#這個函數(shù)會完成和classA2dict函數(shù)相同的功能,即將一個類的所有屬性轉(zhuǎn)換成字典"鍵值對"的形式
#x=json.dumps(a,default=lambda obj:obj.__dict__)
print(type(x)) #
print(x) #"{"website": "python", "name": "py"}"
#字典類型轉(zhuǎn)換成類返回
def dict2classA(d):
return A(d["name"],d["website"])
#將json序列后的數(shù)據(jù)還原成類,object_hook參數(shù)將x轉(zhuǎn)換成字典類型,并傳遞給dict2classA函數(shù)處理,
#dict2classA函數(shù)會讀取這個字典中的每個鍵,將值傳入A類進行初始化,返回一個類對象
x=json.loads(x,object_hook=dict2classA)
print(type(x)) #
print(x.website)
#將序列化的類寫入文件testfile中
with open("testfile","w") as f1:
json.dump(a,f1,default=classA2dict)
#讀取testfile中的數(shù)據(jù)還原
with open("testfile","r") as f2:
y=json.load(f2,object_hook=dict2classA)
print(y.name) 眾多python培訓(xùn)視頻,盡在python創(chuàng)新互聯(lián)教程,歡迎在線學(xué)習(xí)!
本文轉(zhuǎn)自:https://www.jianshu.com/p/f4cfa19abca4
分享題目:創(chuàng)新互聯(lián)Python教程:一文了解Python序列化
標題網(wǎng)址:http://m.fisionsoft.com.cn/article/cdcispd.html


咨詢
建站咨詢
