#序列: 有序的排列, 如列表、元组、字符串、bytes
#序列化: 特指 字符串 ,是将普通的数据类型转换成字符串或bytes的过程
#数据结构: 容器类型
#为什么用序列化: 1、固态的存储一个数据结构;2、在网络上传输一个数据结构
import json
dic = {'k': 'v'}
#序列化
s_dic = json.dumps(dic)#注意字典的key必须是字符串
print(dic, s_dic)#{'k': 'v'} {"k": "v"}
li = [1, 2, 3]
s_li = json.dumps(li)
print(li, type(li), s_li, type(s_li))#[1, 2, 3] <class 'list'> [1, 2, 3] <class 'str'>
#反序列化
new_dic = json.loads(s_dic)
print(new_dic, type(new_dic))# {'k': 'v'} <class 'dict'>
new_li = json.loads(s_li)
print(new_li, type(new_li))# [1, 2, 3] <class 'list'>
#特殊类型:
#元组
tup = (1, 2, 3)
s_tup = json.dumps(tup)
print(s_tup, type(s_tup))#[1, 2, 3] <class 'str'>
new_tup = json.loads(s_tup)
print(new_tup, type(new_tup))#[1, 2, 3] <class 'list'> 元组反序列化后是列表
#集合
# se = {1, 2, 3}
# s_se = json.dumps(se)# 报错 Object of type set is not JSON serializable ,不支持元组
#json 是所有语言通用的数据结构,且key必须是字符串,
# 在Python中当做str
# json支持的数据类型有: 数字、字符串、元组、列表、字典
# 元组序列化时被当作列表,上面元组(1, 2, 3)序列化后变成了[1, 2, 3],集合不支持被序列化
#dump & load,文件操作 dump 写;load 读 但是不能连续dump和load,因为连续以后数据结构不是json了
dit2 = {'k': 'v'}
with open('1.log', 'w') as f1:
json.dump(dit2, f1)
with open('1.log') as f1:
print(json.load(f1))
# json格式化,
# sort_keys按key排序
# indent 每层缩进
# separators 分隔符,第一个是key与value的分隔符,第二个是dict之间的分隔符
# ensure_ascii 默认true,输出ASCII码,改成False可以输出中文
dit3 = {'k2': ['v2-1', 'v2-2'], 'k1': 'v1'}
j_dit3 = json.dumps(dit3, sort_keys=True, indent=2, separators=(',', ':'), ensure_ascii=False)
print(j_dit3)
#pickle: 转成byte类型, 只能Python中使用
# 与json类似,但可以处理字典中key是数字的情况,可以处理所有数据类型
# 可以连续向文件中dump或load
dic = {1: '1', 'k': 'v'}
p_dic = pickle.dumps(dic)
print(p_dic, type(p_dic))# b'\x80\x04\x95\x13\x00\x00\x00\x00\x00\x00\x00}\x94(K\x01\x8c\x011\x94\x8c\x01k\x94\x8c\x01v\x94u.' <class 'bytes'>
new_dic = pickle.loads(p_dic)
print(new_dic, type(new_dic))
#操作文件
with open('1.log', 'wb') as f2:
pickle.dump(dic, f2)
pickle.dump(dic, f2)
with open('1.log', 'rb') as f2:
while True:
try:
r_d = pickle.load(f2)
print(r_d)
except:
break