# print('序列化模块')
# """
# # 什么是序列化?
# # 将对象转化为字符串
# # 什么是反序列化?
# # 将字符串转化为对象
# # 为什么要序列化?
# # 数据的存储和传输都采用的是字符串类型,为了方便数据的传输与存贮
# #
# # 常用的序列化的模块:
# # json pickle shevle
# ##三种模块的比较与主要用途:
# # json :支持跨语言,主要用于数据的传输
# # pickle:支持python的所有数据类型,所以可以将所有python的对象序列化后存储
# 主要用于数据的存贮
# # shelve:支持python的所有数据类型,可以即时存与取,相当于在pickle的基础上优化了存取的方式
#
# ###序列化与反序列化的四种操作方式:
# # 序列化:
# # dump ( 这个功能更强一些)
# # dumps
# # 反序列化
# # load ( 这个功能更强一些)
# # loads
# #
# # 下面分开介绍着三个序列化模块
# #
# 一.json 模块(优势,用于传输,支持多语言,跨平台)
# 什么是json?
# 就是完成文本序列化得到文本字符串,json字符串具有一定的语法规范
#
# 1,支持的数据类型:int float str bool dict list null
# 2,复杂的json数据都是由{}和[]嵌套形成的数据,也就是字典和列表嵌套形成
# 3,json 字符串只能有一个根,不能有两个或者多个
# 4,json中的str类型必须用双引号包裹,不支持单引号 三引号
#
import json
##python 对象,序列化然后变成了json字符串
date = 123
res1 = json.dumps(date)
print(res1,type(res1))
##json字符串反序列化 得到python对象
res2 = json.loads(res1)
print(res2,type(res2))
####整型的123序列化之后得到json字符串形式的123,
##所有的对象经过序列化之后都会变成相应的字符串形式
##该字符串经过反序列化之后就会又得到原来的对象
###注意:
'''
在序列化的过程中,被序列化的对象,只能有一个,例如一个字典 一个字符串 一个列表 或者一个其他自定义的对象,
但是不能有两个,不能同时将两个对象序列化,不管这两个对象的类型是相同还是不同
这个被序列化的对象可以是嵌套的形式,字典套列表 列表再套字典,都是可以的,可以嵌套存在,对外表现还是一个,
但是不能并行,也就是说只能有一个根
'''
json_str1 ="1.223" ##可以被序列化
json_str2 ="false" ##可以被序列化
json_str3 ="[]{}" ####不可以被序列化这种情况下有两个不同数据类型的根
json_str4 ="[][]" ##不可以被序列化,这种情况下,只有一种数据类型,但是有两个,有两个根
json_str5 ="[[],[]]" ###可以被序列化,这种情况下,只两个列表,被一个列表包起来,
# 嵌套起来,变成一个大的列表,这种情况下就不会报错
json_str6 = "123"
obj1 = json.loads(json_str6)
print(obj1,type(obj1))
# # 操作文件
# # #序列化
import json
#
obj = {'name':'szp','age':24,'gender':'男'}
with open('a.txt','w',encoding='utf-8') as wf:
# json.dump(obj,wf)
json.dump(obj,wf,ensure_ascii= False)
##有中文的时候,就将这个ensure_ascii的值修改成False,
# 系统默认的编码是ASCII码,改成FALSE之后,这个默认的代码就会取消,
##采用和现在文本打开的编译一样的编码 也就是UTF-8编码,
##注意只有有中文的时候我们才需要这样设置,没有中文的时候可以不必设置
# # ##反序列化
with open('a.txt','r',encoding='utf-8') as rf:
user_dic = json.load(rf)
print(user_dic,type(user_dic))
"注意:json模块的序列化与反序列化是一一对应关系"
'''
这个dump操作相当于将对象的信息写入文件进行存贮,
load操作相当于将文件的信息进行读取,并且得到原来的对象
如果我们直接将对象写入文件,不适用这些序列化与反序列化模块.
由于文件必须是以文本字符串 或者二进制字符串的形式进行写入的
这就会失去对象内部原来的数据结构数据形式,在重新读取的时候就需要对
信息进行编码,对字符串进行拼接,构造,才能得到原来的对象,非常繁琐与麻烦,
我们可以把序列化模块和反序列化模块理解成一种中间的协议
对象====序列化====>字符串
字符串===反序列化===>原来的对象
所以在这里我们要学会使用这个序列化与反序列化的模块
'''
# 二.pickle模块:支持所有数据类型
# 不能支持跨语言跨平台
import pickle
##序列化
obj = {'name':'szp','age':24,'gender':'男'}
res = pickle.dumps(obj)
print(res,type(res))
print('================')
##反序列化
print(pickle.loads(res),type(pickle.loads(res)))
print('===========================================')
##文件操作:
obj = {'name':'szp','age':24,'gender':'男'}
##将对象序列化写入文件
with open('写入.txt',mode = 'wb') as wf:
###注意:这个地方的写入模式必须是wb模式,也就是二进制字符串写入
##y因为pickle 能序列化所有的数据类型,不仅仅是文本对象,还能是图片.音频 视频 都可以做到,
###所以只能用b字节模式进行操作
pickle.dump(obj,wf)
####将文件反序列化得到原来的数据
with open ('写入.txt',mode = 'rb') as rf:
res = pickle.load(rf)
print(res)
# 三.shelve:
# 支持所有的数据类型,即使存取
# json 主要用于传输,pickle主要用于内部的存贮,
# shelve 主要用于优化存取,存取更快.
'''
前面我们已经学习了两个序列化模块,一个是json 支持跨平台,跨语言,一般用来传输数据
另一个设pickle 支持python的所有数据类型,一般用来做数据存贮,
现在我们再学习第三个:shelve
shelve可以优化存和取的方式
'''
import shelve
she_tool = shelve.open('c.shv')
##序列化
she_tool['name'] = 'owen'
she_tool['info'] = {'name':'szp','age':24,'gender':'male'}
##反序列化
res = she_tool['name']
print(res)