序列化模块 import json
应用的地方: 有两方面会用到 1,网络传输. 2,写文件.
json 格式的限制
1,json 格式的key必须是字符串数据类型
2,json 对元组做value的字典会把元组强行转换成列表
3,不支持元组做key,会报错
4,json 格式中的字符串必须""引起来的
5,set 类型不能转
有四个方法
dumps
loads
dump
load
序列化 , 反序列化
# 序列化 import json dic={'aaa':'bbb','ccc':'ddd'} str_dic=json.dumps(dic) #序列化:将一个字典转换成一个字符串 print(str_dic,type(str_dic)) # 结果:{"aaa": "bbb", "ccc": "ddd"}# json转换完的字符串类型的字典中的字符串是由""表示的 # 反序列化 dic2=json.loads(str_dic) #将一个字符串格式的字典转换成一个字典 print(type(dic2),dic2) # 结果: {'aaa': 'bbb', 'ccc': 'ddd'} # 要用json的loads功能处理字符串类型的字典中的字符串必须是由""表示
嵌套中的序列化,反序列化
import json lst_dic=[1,2,3,{'k1':'n1','k2':'m2'},4,5,6] str_dic=json.dumps(lst_dic) #嵌套在另一个数据类型里面也可以转(序列化) print(type(str_dic),str_dic) # 结果:[1, 2, 3, {"k1": "n1", "k2": "m2"}, 4, 5, 6] lst_dic2=json.loads(str_dic) #同样是嵌套,也可以反序列化 print(type(lst_dic2),lst_dic2) # 结果:[1, 2, 3, {'k1': 'n1', 'k2': 'm2'}, 4, 5, 6]
元组作为value的字典会把元组强制转换成列表
import json dic={'asd':(1,2,3)} str_dic=json.dumps(dic) #元组作为value的字典会把元组强制转换成列表 print(type(str_dic),str_dic) # 结果:{"asd": [1, 2, 3]}
dump 和 load 操作文件(只适合dump一次,load一次)
lst=['aaa',1223,'rrr','fff'] with open('json_f','w')as f: json.dump(lst,f) # 结果:["aaa", 1223, "rrr", "fff"] with open('json_f','r')as f: ret=json.load(f) print(ret) # 结果:['aaa', 1223, 'rrr', 'fff']
想要dump多个数据进入文件用dumps
import json lst=['aaa',1223,'rrr','fff'] lst_dic=[1,2,3,{'k1':'1','k2':'2'},4,5,6] with open('json_f','w')as f: str_lst=json.dumps(lst) #一次dumps(序列化)一个数据 str_dic=json.dumps(lst_dic) f.write(str_lst+'\n') #dumps完成后数据就被序列化了(变成字符串类型,单引号变双引号)不会直接写进文件,还需要write写入文件,写入的时候记得换行 f.write(str_dic+'\n') #数据写进去之后都会变成字符串类型,而且单引号都会变成双引号 # 结果: # ["aaa", 1223, "rrr", "fff"] # [1, 2, 3, {"k1": "1", "k2": "2"}, 4, 5, 6] with open('json_f','r')as f: for i in f: #先把文件内容循环出来,然后再反序列化,使数据还原回本来的样子 ret=json.loads(i) #反序列化上面是用的dumps这里必须要用loads才读的出来,用load会报错 print(type(ret),ret) # 结果: #['aaa', 1223, 'rrr', 'fff'] #[1, 2, 3, {'k1': '1', 'k2': '2'}, 4, 5, 6]
import pickle 模块
pickle要配合dumps(dump) 和 loads(load)一起用 例: pickle.dumps('内容')
pickle.dumps() 转化出来的是bytes类型
pickle.loads() 就是把bytes类型的转化成字符类型
例:
import pickle dic = {1:(12,3,4),('a','b'):4} dic1=pickle.dumps(dic) #将字典转化成bytes类型 dic2=pickle.loads(dic1) #将bytes类型转换为原本类型 print(dic1) print(dic2) # 结果: b'\x80\x03}q\x00(K\x01K\x0cK\x03K\x04\x87q\x01X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00bq\x03\x86q\x04K\x04u.'
通过例题具体看一下
class Student: def __init__(self,name,age): self.name = name self.age = age a1 = Student('alex',83) #实例化对象 ret = pickle.dumps(a1) #通过pickle.dumps转化成bytes类型 print(ret) 小花 = pickle.loads(ret) #反序列化还原成本来的样子,赋值给一个变量 print(小花.name) #通过变量.取具体的值 print(小花.age)
转化成bytes类型存入文件,再读出来
import pickle class Student: def __init__(self,name,age): self.name=name self.age=age a1=Student('小明',17) #实例化对象 with open('json_f','wb')as f: #转化成bytes类型后要以'wb'的模式写入文件 pickle.dump(a1,f) #转化成bytes类型 with open('json_f','rb')as f: #bytes类型读成字符类型要以'rb'的模式 a2=pickle.load(f) #反序列化,还原以前的类型 print(a2.age)