序列化模块
1,定义
- 序列化:就是将一种数据结构(如字典,裂变)等转换成一个特殊的序列(字符串或者bytes)的过程就叫序列化
- 序列化模块:就是讲一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去,他的主要用途:文件读写数据,网络传输数据
- 数据结构→字符串→bytes→→网路传输→→第二方→解码(decode)→原字符串→原数据额结构
json模块
- 不同语言都遵循的一种数据化格式,即不同语言都使用的特殊字符串,完美的兼容性
- json序列化只支持部分Python数据结构:dict,list,tuple,str,int,float,True,False,Nome。
- json模块是将满足条件的数据结果转化成特殊的字符串,并且也可以反序列化还原回去
- json是各种语言通用的
- json模块的两对四个方法
1,用于网路传输
-
dumps,loads
-
将字典类型转换成字符串类型
-
import jsom dic = {'k1':v1,'k2':v2,'k3',v3} str_dic = json.dumps(dic) #序列化,讲一个字典转换成一个特殊字符串 print(type(str_dic),str.dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} 注意,json转换完成的字符串类型的字典中的字符串是“”双引号
-
将字符串类型的字典转换成字典类型
-
import json dic1 = json.loads(str_dic) #反序列化:将一个字符串类型的字典转换成一个字典 print(type(dic1,dic1)) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 注意,要用loads功能处理的字符串类型中的字典必须由“”双引号表示
-
两者公用传输与还原(列表为例)
-
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] list_dic2 = json.loads(str_dic) print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
-
2,用于文件写读
-
dump,load
-
将对象转换成字符串写进文件中
-
dump方法接受一个文件句柄,直接将字典转换成json字符串写入文件中
-
json文件也是文件,是专门储存json字符串的文件
-
import json with open('json_file','w') dic = dic = {'k1':v1,'k2':v2,'k3',v3} json.dump(dic,f)
-
将文件中的字符串类型的字典转换成字典
-
load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
-
import json wirh open('json_file') dic1 = json.load(f) print(dic1,type(dic1))
-
3,其他参数
- ensuer_ascii
- 当它为True的时候,所有非ASCII码字符显示为uXXXX序列
- 在dump时,将ensure__ascii设置为False即可,此时存入json中的中文就可以正常显示
- separators
- 分隔符
- sort_keys
- 将数据根据keys的值进行排序。
4,json序列化储存多个数据到同一个文件中
-
对于json序列化,储存多个数据到一个文件中是有问题的,默认一个json文件只能储存一个json数据,但是也可以解决举例说明
-
对于json 存储多个数据到文件中 dic1 = {'name':'oldboy1'} dic2 = {'name':'oldboy2'} dic3 = {'name':'oldboy3'} f = open('序列化',,mode='a',encoding='utf-8') json.dump(dic1,f) json.dump(dic2,f) json.dump(dic3,f) f.close() f = open('序列化',‘r') ret = json.load(f) ret1 = json.load(f) ret2 = json.load(f) print(ret)
-
上边的代码会报错,下边是解决方法
-
dic1 = {'name':'oldboy1'} dic2 = {'name':'oldboy2'} dic3 = {'name':'oldboy3'} f = open('序列化','a') str1 = json.dumps(dic1) f.write(str1+' ') str2 = json.dumps(dic2) f.write(str2+' ') str3 = json.dumps(dic3) f.write(str3+' ') f.close() f = open('序列化','r') for line in f: print(json.loads(line))
-
import json dic = {1:2,2:3,3:4,4:5} with open('info','w')as f: dic1 = json.dumps(dic) f.write(dic1+' ') f.write(dic1+' ') f.write(dic1+' ') f.write(dic1+' ') with open('info', 'r')as f: for i in f: print(json.loads(i))