Python中的序列化与反序列化

最早接触到这个是当初要调用百度的轨迹纠偏api,请求参数里有一项是如下图所示的字符串

当时的我什么都不懂,第一想法就是先构造dict再一个个放入list中,最后str(list)即可

一顿操作猛如虎,发现api报错,请求参数错误,拿这个范例对着我的格式,发现问题在于范例里的字符串里的dict的key是双引号,而我的是单引号,不是说字符串里单引号双引号一样吗?一脸懵逼,开始想办法如何把单引号换成双引号,构造dict的时候写成双引号也是不行的,最后我自以为很机智的对最后的str进行替换,算是满足了请求参数的要求

 dict_list = dict_list.replace('\'', '\"')

现在回头看看,我之前做的操作其实就是序列化


序列化指将数据结构或者对象转化为字符串,也即把数据结构或者对象由内存中转储到硬盘中

反序列化自然就是指将序列化中得到的字符串读取到内存中,恢复成原来的数据结构或者对象

在Python3中主要是通过json库中的dump(s)和load(s)实现

一、序列化:可序列化对象------->>str

1.利用dumps()实现

import json
list=['this','is','a test']
dict={'mary':83,'machael':99,'jane':66}
list_str=json.dumps(list)
dict_str=json.dumps(dict)
print(list_str)
print(type(list_str))
print(dict_str)
print(type(dict_str))

2.利用dump()实现

import json
list=['this','is','a test']
dict={'mary':83,'machael':99,'jane':66}
json.dump(list,open('list','w+'))
json.dump(dict,open('dict','w+'))

 

即dump()是把序列化结构对象转换成字符串后直接写入了文件

二、反序列化:str------->>可序列化对象

1.利用loads()实现

import json
list_str='["this","is","a test"]'
dict_str='{"mary":83,"machael":99,"jane":66}'
list=json.loads(list_str)
dict=json.loads(dict_str)
print(list)
print(type(list))
print(dict)
print(type(dict))

 

 字符串中的外部必须为单引号,内部的为双引号,否则json库会解析出错:

2.利用load()实现

import json
list=["this","is","a test"]
dict={"mary":83,"machael":99,"jane":66}
json.dump(list,open('list','w+'))
json.dump(dict,open('dict','w+'))
list1=json.load(open('list','r+'))
dict1=json.load(open('dict','r+'))
print(list1,'-----',type(list1))
print(dict1,'-----',type(dict1))

 即load()是将文件中的字符反序列化为原数据结构或者对象

三、总结:

dumps()和load()都是在内存中直接转化数据结构和字符串,dumps直接序列结构到字符串,loads直接字符串到原序列数据 

dump()和load()会读写硬盘中的文件,dump将转化后的字符串写入文件,load读取文件中的字符串转化成原序列数据


参考链接:

https://www.cnblogs.com/bainianminguo/p/6676067.html

https://zhuanlan.zhihu.com/p/41668928

发布了62 篇原创文章 · 获赞 118 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_38412868/article/details/99711044