前言:这一节主要学习json和pickle
背景:
相信大家在日常生活中都有接触大型的网络游戏,打游戏的时候都是自己在电脑上操作,自己刷怪升级;当然也会碰到中午去吃饭然后挂机的情况,让电脑自动的刷怪,吃完饭后再来继续手动操作。在这个过程中我们有挂机,挂机的时候其实就是将之前的操作(如:用技能1、技能2、大招、左右移动等)都以文件的形式进行保存,吃完饭回来之后又接着之前的状态进行游戏而不是重头开始。我们这里要讲的序列化以及反序列化就跟这个很类似,挂机前的操作保存为文件就是序列化,吃完饭回来再加载之前的游戏就是反序列化;另外,日常我们也用过虚拟机,虚拟机的挂载,挂载后的恢复也是这样的情况。
一、json序列化和反序列化
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:qinjiaxi 4 ''' 5 1.序列化是指将内存的对象存成字符串; 6 2.反序列化是指将存起来的字符串变成之前的内存对象; 7 3.json主要作用是所有语言之间的交互,只能进行简单转换比如字符串、列表、字典等,不能处理函数; 8 4.xlm和json一样,逐渐被json替代; 9 ''' 10 import json 11 info = { 12 'name' : 'qinlang', 13 'age' : 3 14 } 15 f = open('test.txt', 'w') 16 # f.write(str(info)) 17 f.write(json.dumps(info))#序列化 18 f.close()
二、json序列化和反序列化(二)
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author:qinjiaxi 4 import json 5 info = { 6 'name' : 'qinlang', 7 'age' : 3, 8 9 } 10 f = open('test.txt', 'w') 11 # f.write(str(info)) 12 f.write(json.dumps(info))#序列化 13 info['age'] = 4#修改字典中的值 14 json.dump(info, f)#第二次序列化 15 f.close() 16 17 #在python2.7里可以一次一次的load,在3.0中只能load一次 18 #注意:写程序时,只dump一次,只load一次,如果必须要多次,就要多保存几个文件 19 import json 20 f1 = open('test.txt', 'r') 21 data = json.loads(f1.read())#反序列化 22 print(data) 23 f1.close()
三、pickle的序列化和反序列化
序列化:
1 # Author:qinjiaxi 2 #pickle相对json来说可以处理复杂的数据类型,但是只能在python中用 3 import pickle 4 def sayhi(name): 5 print("hi",name) 6 info = { 7 'name' : 'qinlang', 8 'age' : 3, 9 'func' : sayhi 10 } 11 f = open('test.txt', 'wb') 12 # f.write(str(info)) 13 f.write(pickle.dumps(info))#序列化 14 f.close() 15 16 pickle.dump(info, f)#第一个是要序列内存的对象,第二个是文件和这个一样f.write(pickle.dumps(info))#序列化
反序列化:
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:qinjiaxi import pickle #必须加上之前定义的函数,不然会报错,因为之前的函数在序列化中运行后释放了就找不到了 #注:这个函数的内存地址跟之前的不一样,反序列化的是整个函数对象 def sayhi(name): print("hi",name) print('hi2',name)#还可以增加其他功能 f1 = open('test.txt', 'rb') data = pickle.loads(f1.read())#反序列化 print(data) print(data['func']('hehe'))# f1.close() data = pickle.load(info,f)#相当于data = pickle.loads(f1.read())#反序列化