json模块和pickle 模块(序列化模块)
-
什么是序列化?
序列化就是将内粗这种的数据类型转成另一种格式
序列化:字典类型——>序列化——>其他格式——>存入硬盘(存)
反序列化:硬盘——>读取——>其他格式——>反序列化——>字典(取)
-
为什么要序列化?
1.长久保存程序的运行状态
2.数据的跨平台交互
-
如何序列化
优点:这种是一种通用的格式,所有编程语言识别
缺点:不能识别所有python类型
pickle:
优点:能识别所有python数据类型
缺点:序列化后的格式只能被python语言识别
#json 格式(不支持python的元组和集合类型,set \tuple) import json #序列化 dic = {'k1': True, 'k2': 11, 'k3': 'ming'} dic_json = json.dumps(dic) print(dic_json, type(dic_json)) #运行结果 {"k1": true, "k2": 11, "k3": "ming"} <class 'str'> #运行后的结果是一段在python中的字符串,已经序列化 with open('a.json', mode='wt', encoding='utf-8')as f: f.write(dic_json) #将序列化为json格式的数据类型写入硬盘(持久化) #读取时候只需要反序列化即可 with open('a.json', mode='rt', encoding='utf-8')as f: dic_json = f.read() dic = json.loads(dic_json) print(dic, dic['k1']) #运行结果 {'k1': True, 'k2': 11, 'k3': 'ming'} True #该过程就是一个反序列化读取过程 #当然上述代码还可以精简 import json dic = {'k1': True, 'k2': 11, 'k3': 'ming'} with open('b.json', mode='wt')as f: json.dump(dic, f) #序列化加持久化括号传入参数为字典,f #注意dump与dumps的区别 #反序列化 with open('b.json', mode='rt', encoding='utf-8')as f : d = json.load(f) #注意load和loads的区别 print(d, d['k2']) #运行结果 {'k1': True, 'k2': 11, 'k3': 'ming'} 11
#pickle 格式(支持所有的python数据类型,但是只能被python语言接收) import pickle #二进制的序列化 s = {1, 2, 'ming', 5} #这是一个json不支持序列化的集合类型 s_pkl = pickle.dumps(s) #pickle序列化操作 print(s_pkl, type(s_pkl)) with open('c.pkl', mode='wb') as f: #进行持久化操作,写入硬盘 f.write(s_pkl) 运行结果 b'\x80\x03cbuiltins\nset\nq\x00]q\x01(K\x01K\x02X\x04\x00\x00\x00mingq\x02K\x05e\x85q\x03Rq\x04.' <class 'bytes'> with open('c.pkl', mode='rb')as f: #反序列化操作(读取) s_pkl = f.read() s = pickle.loads(s_pkl) print(s, type(s)) 运行结果 {1, 2, 'ming', 5} <class 'set'> #同样用dump和load的方法也更为简洁 dic = {'k1': True, 'k2': 11, 'k3': 'ming', 'k4': '你好啊'} with open('d.pkl', mode='wb')as f: #pickle 序列化和持久化 dic_pkl = pickle.dump(dic, f) print(dic_pkl) with open('d.pkl', mode='rb')as f: #反序列化 dic = pickle.load(f) print(dic, type(dic), dic['k4']) #输出结果 None {'k1': True, 'k2': 11, 'k3': 'ming', 'k4': '你好啊'} <class 'dict'> 你好啊