標籤:obj 參數 二進位 type 序列 dump ror 資料類型 轉換
json / pickle 資料序列化
序列化定義:把變數從記憶體中變成可儲存或傳輸的過程稱為序列化。
還原序列化:把變數內容從序列化的對象重新讀到記憶體裡稱為反序列胡。
序列化模組之--pickle
使用注意:在python3裡,進行一次序列化後,然後在進行還原序列化,不要重複多次序列化,否則無法進行還原序列化。
pickle:是python專屬的序列化模組,只能作用於python變數,是將資料對象轉化為bytes。
功能:用於python特有的類型和python的資料類型間進行轉換。
舉例:
1 import pickle2 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 pickle2 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 pickle2 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 pickle2 f = open(‘fname‘,‘rb‘)3 print(pickle.loads(f.read())) #將bytes通過loads進行還原序列化4 f.close()
View Code
還原序列化舉例2:
load:直接將dump後的序列化檔案進行還原序列化載入。
1 import pickle2 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 json2 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 json2 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 jsond = {‘name‘:‘jeck‘,‘age‘:‘22‘,‘工作‘:‘IT‘}f = open(‘fname1‘,‘w‘)json.dump(d,f)f.close()
還原序列化舉例1:
loads:先讀取對象,然後用loads進行還原序列化
1 import json2 f = open(‘fname‘,‘r‘)3 print(json.loads(f.read())) #將字串通過loads進行還原序列化4 f.close()
View Code
還原序列化舉例2:
load:直接將dump後的序列化檔案進行還原序列化載入。
1 import json2 f = open(‘fname1‘,‘rb‘)3 print(json.load(f))4 f.close()
View Code
# 注意 json也可以序列化python中的函數和類,但是序列化後的資料只是函數或者類的結果資料。
舉例序列化一個類:
1 import json2 def fun(n):3 return n4 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 pickle2 def fun(n):3 return n4 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 pickle2 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學習之 -- 資料序列化