1. 程式人生 > >python學習之 -- 數據序列化

python學習之 -- 數據序列化

單獨 get 多次 __main__ print lambda 字典 學習 module

json / pickle 數據序列化

序列化定義:把變量從內存中變成可存儲或傳輸的過程稱為序列化。
反序列化:把變量內容從序列化的對象重新讀到內存裏稱為反序列胡。

序列化模塊之--pickle
使用註意:在python3裏,進行一次序列化後,然後在進行反序列化,不要重復多次序列化,否則無法進行反序列化。
pickle:是python獨有的序列化模塊,只能作用於python變量,是將數據對象轉化為bytes。
功能:用於python特有的類型和python的數據類型間進行轉換。
舉例:
技術分享
1 import pickle
2 d = {name:jeck,age:22}
3 print(pickle.dumps(d))
View Code
打印出:b‘\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x08 #這裏b代表為bytes
pickle的4個功能如下:
dumps , dump:進行序列化功能
loads , load:進行反序列化功能

序列化舉例1:
dumps 序列化作用於變量,將傳入的變量序列化為一個bytes,然後可以寫入磁盤。
技術分享
1 import pickle
2 d = {name:jeck,age:22,工作:IT}
3 f = open(fname,wb) #必須以二進制讀寫
4 f.write(pickle.dumps(d))
5 f.close()
View Code
序列化舉例2:
dump 直接將變量序列化到文件中
技術分享
1 import pickle
2 d = {name:jeck,age:22,工作:IT}
3 f = open(fname1,wb)
4 pickle.dump(d,f)
5 f.close()
View Code
反序列化舉例1:
loads:把對象從磁盤讀入內存時,先把內容讀到一個bytes,然後用loads進行反序列化
技術分享
1 import pickle
2     f = open(fname,rb)
3     print(pickle.loads(f.read())) #
將bytes通過loads進行反序列化 4 f.close()
View Code
反序列化舉例2:
load:直接將dump後的序列化文件進行反序列化載入。
技術分享
1 import pickle
2     f = open(fname1,rb)
3     print(pickle.load(f))
4 f.close()
View Code
序列化模塊之-- json
json:是個對象序列化的標準格式,用於在不同編程語言之間進行對象的傳遞。類似的有xml。
但和xml表現形式不同,json表現為一個字符串,xml是用標記標註的不易閱讀。在速度上json也比xml快。
註意:一般用於序列化通用的列表,字典,等常用序列。如果要序列化python裏的函數,類需要單獨指定
方法和pickle一樣,有:dumps,dump 進行序列化。loads,load 進行反序列化
功能:用於字符串和python數據類型間進行轉換。
舉例:json序列化後的格式為字符串
技術分享
1 import json
2 d = {name:jeck,age:22,工作:IT}
3 print(json.dumps(d))
4 print(type(json.dumps(d)))
View Code
打印:
{"name": "jeck", "age": "22", "\u5de5\u4f5c": "IT"}
<class ‘str‘>
序列化舉例1:
dumps 序列化作用於變量,將傳入的變量序列化為一個字符串,然後可以寫入磁盤。
技術分享
1 import json
2 d = {name:jeck,age:22,工作:IT}
3 f = open(fname,w)
4 f.write(json.dumps(d))
5 f.close()
View Code
序列化舉例2:
dump 直接將變量序列化到文件中
import json
d = {name:jeck,age:22,工作:IT}
f = open(fname1,w)
json.dump(d,f)
f.close()
反序列化舉例1:
loads:先讀取對象,然後用loads進行反序列化
技術分享
1 import json
2 f = open(fname,r)
3 print(json.loads(f.read())) #將字符串通過loads進行反序列化
4 f.close()
View Code
反序列化舉例2:
load:直接將dump後的序列化文件進行反序列化載入。
技術分享
1 import json
2 f = open(fname1,rb)
3 print(json.load(f))
4 f.close()
View Code
# 註意 json也可以序列化python中的函數和類,但是序列化後的數據只是函數或者類的結果數據。
舉例序列化一個類:
技術分享
1 import json
2 def fun(n):
3     return n
4 x = fun(jeck)
5 f = open(fname,w)
6 f.write(json.dumps(x,default=fun))  #default參數就是告知json如何進行序列化
7 f.close
View Code
一般通用方法為:
print(json.dumps(x, default=lambda obj: obj.__dict__))
其中的__dict__不需我們在類中定義,因為通常class的實例都有一個__dict__屬性,它就是一個字典,用來存儲實例變量.
當然函數和類序列化一般也不會使用。

在單獨舉例通過pickle對函數的序列化和反序列化舉例
1:進行函數的序列化
技術分享
1 import pickle
2 def fun(n):
3     return n
4 f = open(fname,wb)
5 f.write(pickle.dumps(fun))
6 f.close  #成功
View Code
2:進行反序列化
import pickle
f = open(‘fname‘,‘rb‘)
pickle.loads(f.read())
f.close
報錯:AttributeError: Can‘t get attribute ‘fun‘ on <module ‘__main__‘ from
是因為序列化後內存已釋放這個函數的內存地址,所以報錯。需要手工把這個函數添加到反序列化開頭如下:
技術分享
1 import pickle
2 def fun(n):
3     return n # 這個函數內容可以手工修改。
4 f = open(fname,rb)
5 print(pickle.loads(f.read()))
6 f.close
View Code
這樣才可以實現函數的反序列化,個人覺得沒啥意義。而且反序列化時可以先修改函數內容,這樣反序列化出的內容就是修改後的內容。

註意:pickle和json的序列化和反序列化必須各自獨自使用,不能相互混用。

python學習之 -- 數據序列化