python之序列化json模块与pickle模块(待补充)

时间:2023-03-09 07:12:56
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

  1. 所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,None。
  2. 由任何原生类型组成的列表,元组,字典和集合。
  3. 函数,类,类的实例
 

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)