python之序列化json模块与pickle模块(待补充)
一.json是所有语言都通用的一种序列化格式
只支持 : 列表,字典字符串,数字,且字典的key必须是字符串
'''
1. dumps , loads
在内存中做数据转换:
dumps : 数据类型 转成 字符串 ------序列化
loads : 字符串 转成 数据类型------反序列化
2. dump , load
直接将数据类型写入文件,直接从文件中读出数据类型
dump 数据类型 写入 文件 序列化
load 文件 读出 数据类型 反序列化
'''
1、写操作.json文件dumps()、dump()函数
d = { 'zll': { 'addr': '北京', 'age': 28 }, 'ljj': { 'addr': '北京', 'age': 38 } }
fw = open('user_info.json', 'w', encoding='utf-8') # ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示 # dic_json = json.dumps(d,ensure_ascii=False,indent=4) #字典转成json格式,字典转成字符串 dic_json = json.dumps(d, ensure_ascii=True, indent=4) # 字典转成json格式,字典转成字符串 fw.write(dic_json) fw.close() 结果 { "zll": { "addr": "\u5317\u4eac", "age": 28 }, "ljj": { "addr": "\u5317\u4eac", "age": 38 } } fw = open('user_info.json', 'w', encoding='utf-8') # ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示 dic_json = json.dumps(d,ensure_ascii=False,indent=4) #字典转成json,字典转成字符串 fw.write(dic_json) fw.close() 结果 { 9 "zll": { 10 "addr": "北京", 11 "age": 28 12 }, 13 "ljj": { 14 "addr": "北京", 15 "age": 38 16 } 17 }
dump() 操作json文件 写的操作
fw = open('user_info.json', 'w', encoding='utf-8') json.dump(d,fw,ensure_ascii=False,indent=4) #操作文件 fw.close() 结果 { "zll": { "addr": "北京", "age": 28 }, "ljj": { "addr": "北京", "age": 38 } }
2、读操作load()、loads()
# json串是一个字符串 f = open('product.json',encoding='utf-8') res = f.read() product_dic = json.loads(res) #把json串,变成python的数据类型,只能转换json串内容 print(product_dic) print(product_dic['iphone']) # t = json.load(f) # print(t) #传一个文件对象,它会帮你直接读json文件,并转换成python数据 # print(t['iphone']) f.close() 结果 {'iphone': {'color': 'red', 'num': 1, 'price': 98.5}, 'wather': {'num': 100, 'price': 1, 'color': 'white'}} {'color': 'red', 'num': 1, 'price': 98.5}
# 文件读写 def op_file(file, dict_temp=None): if dict_temp: with open(file, 'w', encoding='utf-8') as fw: json.dump(dict_temp, fw, ensure_ascii=False, indent=4) return 1 else: with open(file, 'r', encoding='utf-8') as fr: dict_temp = json.load(fr) return dict_temp
二.pickle
- 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。
- 由任何原生类型组成的列表,元组,字典和集合。
- 函数,类,类的实例
pickle.dump(obj, file[, protocol])
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。
------------------------------------------
pickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象。
其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错:
# dumps功能 import pickle data = ['aa', 'bb', 'cc'] # dumps 将数据通过特殊的形式转换为只有python语言认识的字符串 p_str = pickle.dumps(data) print(p_str) b'\x80\x03]q\x00(X\x02\x00\x00\x00aaq\x01X\x02\x00\x00\x00bbq\x02X\x02\x00\x00\x00ccq\x03e.
# loads功能 # loads 将pickle数据转换为python的数据结构 mes = pickle.loads(p_str) print(mes) #['aa', 'bb', 'cc']
# dump功能 # dump 将数据通过特殊的形式转换为只有python语言认识的字符串,并写入文件 with open('D:/tmp.pk', 'w') as f: pickle.dump(data, f)
# load功能 # load 从数据文件中读取数据,并转换为python的数据结构 with open('D:/tmp.pk', 'r') as f: data = pickle.load(f)