天天看點

python 序列化子產品json和pickle

什麼叫序列化?

序列化是指把記憶體裡的資料類型轉變成字元串,以使其能存儲到硬碟或通過網絡傳輸到遠端,因為硬碟或網絡傳輸時隻能接受bytes

為什麼要序列化?

你打遊戲過程中,打累了,停下來,關掉遊戲、想過2天再玩,2天之後,遊戲又從你上次停止的地方繼續運作,你上次遊戲的進度肯定儲存在硬碟上了,是以何種形式呢?遊戲過程中産生的很多臨時資料是不規律的,可能在你關掉遊戲時正好有10個清單,3個嵌套字典的資料集合在記憶體裡,需要存下來?你如何存?把清單變成檔案裡的多行多列形式?那嵌套字典呢?根本沒法存。是以,若是有種辦法可以直接把記憶體資料存到硬碟上,下次程式再啟動,再從硬碟上讀回來,還是原來的格式的話,那是極好的。

用于序列化的兩個子產品

json,用于字元串 和 python資料類型間進行轉換

pickle,用于python特有的類型 和 python的資料類型間進行轉換

pickle子產品提供了四個功能:dumps、dump、loads、load

import pickle
data = {'k1':123,'k2':'Hello'}
# pickle.dumps 将資料通過特殊的形式轉換位隻有python語言認識的字元串
p_str = pickle.dumps(data)  # 注意dumps會把資料變成bytes格式
print(p_str)
# pickle.dump 将資料通過特殊的形式轉換位隻有python語言認識的字元串,并寫入檔案
with open('result.pk',"wb") as fp:
    pickle.dump(data,fp)
# pickle.load  從檔案裡加載
f = open("result.pk","rb")
d = pickle.load(f)
print(d)
           

Json子產品也提供了四個功能:dumps、dump、loads、load,用法跟pickle一緻

import json
# json.dumps 将資料通過特殊的形式轉換位所有程式語言都認識的字元串
j_str = json.dumps(data) # 注意json dumps生成的是字元串,不是bytes
print(j_str)
#dump入檔案 
with open('result.json','w') as fp:
    json.dump(data,fp)
#從檔案裡load
with open("result.json") as f:
    d = json.load(f)
    print(d)
json vs pickle:
JSON:
           

優點:跨語言(不同語言間的資料傳遞可用json交接)、體積小

缺點:隻能支援int\str\list\tuple\dict