玩過稍微大型一點的遊戲的朋友都知道,不少遊戲的存檔功能使得咱們能夠方便地迅速進入上一次退出的狀態(包括裝備、等級、經驗值等在內的一切運行時數據),那麼在程序開發中也存在這樣的需求:比較簡單的程序,對象的處理都在內存中直接實現,程序退出後對象就消失;但對於功能需求稍微拔高一點的程序來說,不少時候每每須要須要把對象持久化保存起來,以便下次啓動程序時還能直接進入最後一次的狀態。html
這個處理過程在程序開發中就是序列化與反序列化。python
概述中引入了一個遊戲存檔的場景,本質上是遊戲程序把運行時的對象轉換成能夠持久存儲的對象,而後保存(到數據庫)的過程。仍是以這個爲引子來說講序列化與反序列化的概念(如下概念整合自網絡資料,我的認爲解釋比較到位了)。數據庫
python中的序列化與反序列化模塊有json和pickle,下面就來看看怎麼玩轉它們。編程
json模塊提供了dumps,loads,dump和load四種方法,下面展開來闡述:json
1 >>> import json 2 >>> list1=['a','b','c'] 3 >>> print(type(list)) 4 <class 'type'> 5 6 #dumps序列化,能夠理解爲encode json過程 7 >>> print(json.dumps(list1)) 8 ["a", "b", "c"] 9 >>> print(type(json.dumps(list1))) 10 <class 'str'> #list dumps處理後變爲str類型 11 >>> dict1={'id':'001','name':'Maxwell'} 12 >>> print(type(dict1)) 13 <class 'dict'> 14 >>> print(type(json.dumps(dict1))) 15 <class 'str'> #dict通過dumps處理後也變成str類型 16 >>> 17 18 #loads反序列化 19 >>> print(json.loads(json.dumps(list1))) 20 ['a', 'b', 'c'] 21 >>> print(json.loads(json.dumps(dict1))) 22 {'id': '001', 'name': 'Maxwell'} 23 >>> print(type(json.loads(json.dumps(list1)))) 24 <class 'list'> #把通過json dumps處理過的字符串loads序列化,可還原爲原來的數據類型 25 >>> print(type(json.loads(json.dumps(dict1)))) 26 <class 'dict'> #把通過json dumps處理過的字符串loads序列化,可還原爲原來的數據類型
1 >>> str1='["a", "b", "c"]' 2 >>> print(type(json.loads(str1))) 3 <class 'list'> #反序列化爲list 4 >>> print(json.loads(str1)) 5 ['a', 'b', 'c'] 6 >>> str2='{"id":"001","name":"Maxwell"}' 7 >>> print(json.loads(str2)) 8 {'id': '001', 'name': 'Maxwell'} 9 >>> print(json.loads(str2)) 10 {'id': '001', 'name': 'Maxwell'} 11 >>> print(type(json.loads(str2))) 12 <class 'dict'> #反序列化爲dict
1 import json 2 dict1={'id':'001','name':'Maxwell'} 3 with open('dumps.txt','w',encoding='utf-8') as f: 4 f.write(json.dumps(dict1)) 5
1 >>> import json 2 >>> with open('dumps.txt','r',encoding='utf-8') as f: 3 ... content = f.read() 4 >>> print(json.loads(content)) 5 {'id': '001', 'name': 'Maxwell'} 6 >>> print(type(json.loads(content))) 7 <class 'dict'> #loads反序列化後成功還原爲原來的數據類型dict 8 >>> print(json.loads(content).get('name')) 9 Maxwell #此時能夠應用dict的各類大法了 10 >>> print(json.loads(content)['name']) 11 Maxwell
1 >>> import json 2 >>> dict1={'id': '001', 'name': 'Maxwell'} 3 >>> with open('dump.txt','w',encoding='utf-8') as f: 4 ... json.dump(dict1,f) #dump序列化,直接操做原生數據類型對象和文件句柄 5 ... 6 7 #load反序列化 8 >>> with open('dump.txt','r',encoding='utf-8') as f: 9 ... content = json.load(f) #注意這裏先用一個對象把load的內容保存起來,不然關閉文件後就不能再訪問了 10 ... 11 >>> print(content) 12 {'id': '001', 'name': 'Maxwell'} 13 >>> print(type(content)) 14 <class 'dict'> #成功反序列化成dict 15 >>> print(content['name']) 16 Maxwell #試試dict大法
pickle模塊實現了用於對Python對象結構進行序列化和反序列化的二進制協議,與json模塊不一樣的是pickle模塊序列化和反序列化的過程分別叫作 pickling 和 unpickling,且轉換先後是二進制字節碼,再也不是簡單的可閱讀的字符串:網絡
1 >>> import pickle 2 >>> dict1={'id':'001','name':'Maxwell'} 3 >>> pickle.dumps(dict1) 4 b'\x80\x03}q\x00(X\x02\x00\x00\x00idq\x01X\x03\x00\x00\x00001q\x02X\x04\x00\x00\ 5 x00nameq\x03X\x07\x00\x00\x00Maxwellq\x04u.' #序列化成二進制字節碼 6 >>> print(type(pickle.dumps(dict1))) 7 <class 'bytes'> 8 >>> pickle.loads(pickle.dumps(dict1)) #成功反序列化 9 {'id': '001', 'name': 'Maxwell'} 10 >>> print(type(pickle.loads(pickle.dumps(dict1)))) 11 <class 'dict'> 12 >>> pickle.loads(pickle.dumps(dict1))['name'] 13 'Maxwell'
1 >>> import pickle 2 >>> dict1={'id':'001','name':'Maxwell'} 3 >>> with open('picklt.txt','wb') as f: #以wb模式打開文件後寫入dumps內容 4 ... f.write(pickle.dumps(dict1)) 5 ... 6 7 >>> with open('picklt.txt','rb') as f: #以rb模式打開後讀取內容 8 ... data = pickle.loads(f.read()) 9 ... 10 >>> print(data) 11 {'id': '001', 'name': 'Maxwell'}
1 >>> import pickle 2 >>> dict1={'id': '001', 'name': 'Maxwell'} 3 >>> with open('pickle.txt','wb') as f: 4 ... pickle.dump(dict1,f) 5 ... 6 >>> with open('pickle.txt','rb') as f: 7 ... content = pickle.load(f) 8 ... 9 >>> print(content) 10 {'id': '001', 'name': 'Maxwell'} 11 >>> print(content['name']) 12 Maxwell
1 # !/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 __author__ = 'Maxwell' 4 5 import pickle 6 7 def sayhi(name): 8 print('Hello:', name) 9 10 info = {'name':'Maxwell', 'func':sayhi} #func對應的值是一個函數 11 12 with open('test.txt', 'wb') as f: 13 data = pickle.dumps(info) 14 f.write(data) 15
1 # !/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 __author__ = 'Maxwell' 4 5 import pickle 6 7 def sayhi(name): #此處須要定義出函數,由於它不能被直接加載到內存中 8 print('Hello:',name) 9 10 with open('test.txt','rb') as f: 11 data = pickle.loads(f.read()) 12 13 print(data.get('name')) 14 data.get('func')('Tom') 15 16 結果輸出: 17 Maxwell 18 Hello: Tom