把对象(变量)从内存中变成可存储或传输的过程称为序列化
1.json模块
如果要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,如果有序列化为JSON表示出来的就是一个字符串,可以被所有语言读取,也可以方便的存储到磁盘或者通过网络传输
JSON和Python内置的数据类型对应如下:
JSON类型 | Python类型 |
{} | dict |
[] | list |
"string" | str |
123.45 | int或float |
True/False | True/False |
null | None |
1 import json 2 dic = {"name":"abc","age":18} 3 print(type(dic))#<class 'dict'> 4 5 j = json.dumps(dic) 6 print(type(j))#<class 'str'> 7 8 f = open("序列化对象",'w') 9 f.write(j)#等价于json.dump(dic,f) 10 f.close() 11 12 #反序列化 13 f = open("序列化对象") 14 data = json.loads(f.read())#等价于data = json.load(f)
1.
1 import json 2 dic = {1:"value1",2:"value2"} 3 ret = json.dumps(dic) 4 res = json.loads(ret) 5 print(dic,type(dic))#{1:'value1',2:'value2'}<class 'dict'> 6 print(ret,type(ret))#{"1":"value1","2":"value2"}<class 'str'> 7 print(res,type(res))#{'1':'value1','2':'value2'}<class 'dict'>
2.
1 import json 2 dic = {1 : [1,2,3],2 : (4,5,'aa')} 3 ret = json.dumps(dic) 4 print(dic,type(dic))#{1:[1,2,3],2:(4,5,'aa')}<class 'dict'> 5 print(ret,type(ret))#{"1":[1,2,3],"2":[4,5,"aa"]}<class 'str'>
如果字典的值为元组,序列化后会转为列表
3.
1 import json 2 s = {1,2,3} 3 s1 = json.dumps(s) 4 print(s1) 5 #会报错TypeError: Object of type set is not JSON serializable 6 集合类型不是可序列化的对象
4.
1 import json 2 dic = {(1,2,3):123} 3 dic1 = json.dumps(dic) 4 print(dic1)
会报错
TypeError: keys must be str, int, float, bool or None, not tuple
字典的键必须是str,int,float,bool或None,元组不能作为键
5.
1 import json 2 dic = {"key1":"value1","key2":"value2"} 3 with open("json_file","a") as f: 4 json.dump(dic,f) 5 json.dump(dic,f) 6 7 with open("json_file","r") as f: 8 dic = json.load(f)
不支持连续的存取
dumps和loads
在内存中做数据转换:
dumps 数据类型转成字符串 #序列化
loads 字符串转成数据类型 #反序列化
dump和load
直接将数据类型写入文件,直接从文件中读出数据类型
dump 数据类型写入文件 #序列化
load 从文件读出数据类型 #反序列化
2.pickle模块
1.支持在python中几乎所有的数据类型
2.dumps序列化的结果只能是字节
3.只能在python中使用
4.在和文件操作的时候,需要用rb,wb的模式打开文件
5.可以多次dump和load