標籤:python_json python_pickle
JSON(JavaScript Object Notation)是一種輕量級的資料交換格式
由於檔案在記憶體中只能以二進位、字串的形式儲存。當儲存字典、函數的時候,就需要使用json序列化。json就好比是虛擬機器中的掛起,隨時開啟,隨時掛起。
一、儲存字典資料
1、json序列化資料
import jsoninfo = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘}f = open(‘test.txt‘,‘w‘) #開啟test.txt檔案,並寫入f.write(json.dumps(info)) #json.dumps對資料進行編碼,不負責寫入!print (json.dumps(info)) #列印json.dumps編碼後的資料f.close()
此時資料已經以字串的形式儲存在硬碟。如果只取出其中[age]的資料,下面的例子是無法提取資料的。
2、錯誤示範
f = open(‘test.txt‘,‘r‘)date = f.read()print (date[‘age‘])f.close()
原因分析:因為資料只能以字串、二進位的形式儲存,直接以字典的形式“date[age]”是絕對無法提取的。
3、json還原序列化資料
import jsonf = open(‘test.txt‘,‘r‘) #開啟test.txt檔案,並讀取date = json.loads(f.read()) #json.loads對資料進行解碼print (date[‘age‘])print (date[‘name‘])f.close()
經過json.loads解碼的資料將恢複成來源資料的樣式,可以直接輸出。
4、另一種簡單方法(eval()方法)
f.open(‘test.txt‘,‘r‘)date = eval(f.read())print (date([‘age‘]))f.close()
二、儲存函數(pickle)
json只能處理簡單的資料類型,例如:字典、列表等。無法處理函數。json在所有語言中都通用,可以用於不同語言之間互動。
pickle可以處理複雜的資料,使用方式和json一模一樣!pickle只適用於python
1、pickle序列化資料
import pickledef hello(name): print (‘hello!‘,name)info = { ‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘, ‘func‘:hello} #函數hello的記憶體位址傳遞給func f = open(‘test1.py‘,‘wb‘) #pickle.dumps()直接將資料轉寄為二進位儲存,因此需要用‘wb‘ print (pickle.dumps(info)) #列印pickle編碼後的資料 f.write(pickle.dumps(info)) #寫入編碼後資料 f.close()
析:pickle具有一套文法規則,編碼後的資料在檔案中是以一種類似“亂碼”的樣子儲存
2、pickle還原序列化(錯誤示範)
import picklef = open(‘test1.txt‘,‘rb‘) #儲存的二進位,必須用‘re‘讀取date = pickle.loads(f.read()) print (date)
原因分析:此時是無法執行的。因為test1.txt中儲存了一個函數“hello”,當序列化的代碼執行完之後,函數“hello”的記憶體位址就會被釋放,因此字典info中‘func’就沒有值。
3、pickle還原序列化(正確示範)
import pickledef hello(name): print (‘hello,hello!!‘,name)f = open(‘test1.txt‘,‘rb‘)date = pickle.loads(f.read())print (date[‘func‘]) #輸出記憶體位址print(date[‘func‘](‘peter‘)) #調用hello函數,輸出“hello,hello!!,peter”
由於之前函數被釋放,重新定義相同函數名字的函數即可。
三、小技巧
1、簡寫方式
f.write(json.dumps(info))json.loads(f.read())
以上代碼可以簡寫為:
json.dump(info,f)json.load(f)
2、多次dump,一次load(3.0以上版本)
import jsoninfo = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘}f = open(‘test.txt‘,‘w‘)json.dump(info,f)info[‘age‘]=‘33‘json.dump(info,f)info[‘name‘]=‘Tom‘json.dump(info,f)
結果會輸出三個字典,此時通過json.load(f)就會出錯!但是刻印通過for迴圈調用資料
疑問:1.pickle在處理函數時,具體是序列化整個函數,還是函數的記憶體位址
json,pickle淺析,請指教