前言:这一节主要学习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())#反序列化
来源:https://www.cnblogs.com/qinlangsky/p/9581866.html