玩过稍微大型一点的游戏的朋友都知道,不少游戏的存档功能使得咱们能够方便地迅速进入上一次退出的状态(包括装备、等级、经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的程序,对象的处理都在内存中直接实现,程序退出后对象就消失;但对于功能需求稍微拔高一点的程序来说,不少时候每每须要须要把对象持久化保存起来,以便下次启动程序时还能直接进入最后一次的状态。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