“来把这个字典给我转一下json格式”。
“把这个结果给我转一下字典,获取一下键值”。
时常接触这些的小伙伴看过来了,这一次绝对带你搞懂序列化和反序列化。
什么叫序列化?
序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘,或通过网络传输到远程。因为硬盘或网络传输时只能接受bytes。
一句话总结就是序列化就是把字典或者列表的形式的数据转换成字符串,方便在硬盘中保存数据。
就好比说我们记事本上写的数据,都会是字符的形式。也正是因为这个,序列化就是硬盘的保存数据格式。
反过来说,需要把数据加载到内存中去的话,就需要反序列化,把字符串的转换成内存可以方便处理的字典的形式。
为什么要序列化?
就像是你打游戏过程中,打累了停下来,或者关掉游戏想过2天再玩,2天之后,游戏又从你上次停止的地方继续运行,你上次游戏的进度肯定保存在硬盘上了。
是以何种形式呢?游戏过程中产生的很多临时数据是不规律的,可能在你关掉游戏时正好有10个列表,3个嵌套字典的数据集合在内存里,需要存下来?你如何存?把列表变成文件里的多行多列形式?那嵌套字典呢?根本没法存。
所以,若是有种办法可以直接把内存数据存到硬盘上,下次程序再启动,再从硬盘上读回来,还是原来的格式的话,那就达到了预期效果了。
用于序列化的两个模块
json用于字符和 python数据类型间进行转换
pickle用于 pyonpython有的类型和的数据类型间进行转换
Json vs pickle:
JSON
优点:跨语言(不同语言间的数据传递可用json交接)、体积小
缺点:只能支持 int,str,tuple,dict
pickle
优点:专为 python设计,支持 pythonf所有的数据类型
缺点:只能在python中使用,存储数据占空间大
举一个例子吧
pickle使用
数据:
data = {
"stu_info_01": {
"stu_name": "Jack",
"stu_age": 12,
"stu_score": 90,
"stu_level": "优"
},
"stu_info_02": {
"stu_name": "Black",
"stu_age": 11,
"stu_score": 80,
"stu_level": "良好"
}
}
如果直接保存字典类型的数据,会报错。
序列化 dumps
反序列化 loads
import pickle
data = {
"stu_info_01": {
"stu_name": "Jack",
"stu_age": 12,
"stu_score": 90,
"stu_level": "优"
},
"stu_info_02": {
"stu_name": "Black",
"stu_age": 11,
"stu_score": 80,
"stu_level": "良好"
}
}
data_dumps = pickle.dumps(data) #序列化
print(data_dumps)
data_loads = pickle.loads(data_dumps) #反序列化
print(data_loads)
结果:
b'\x80\x04\x95\x84\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x0bstu_info_01\x94}\x94(\x8c\x08stu_name\x94\x8c\x04Jack\x94\x8c\x07stu_age\x94K\x0c\x8c\tstu_score\x94KZ\x8c\tstu_level\x94\x8c\x03\xe4\xbc\x98\x94u\x8c\x0bstu_info_02\x94}\x94(h\x03\x8c\x05Black\x94h\x05K\x0bh\x06KPh\x07\x8c\x06\xe8\x89\xaf\xe5\xa5\xbd\x94uu.'
{'stu_info_01': {'stu_name': 'Jack', 'stu_age': 12, 'stu_score': 90, 'stu_level': '优'}, 'stu_info_02': {'stu_name': 'Black', 'stu_age': 11, 'stu_score': 80, 'stu_level': '良好'}}
写文件 pickle.dump(data, fw)
import pickle
data = {
"stu_info_01": {
"stu_name": "Jack",
"stu_age": 12,
"stu_score": 90,
"stu_level": "优"
},
"stu_info_02": {
"stu_name": "Black",
"stu_age": 11,
"stu_score": 80,
"stu_level": "良好"
}
}
fw = open("data.pkl", "wb")
pickle.dump(data, fw)
读文件 pickle.load(fr)
import pickle
fr = open("data.pkl", "rb")
data_read = pickle.load(fr)
print(data_read)
结果是:
{'stu_info_01': {'stu_name': 'Jack', 'stu_age': 12, 'stu_score': 90, 'stu_level': '优'}, 'stu_info_02': {'stu_name': 'Black', 'stu_age': 11, 'stu_score': 80, 'stu_level': '良好'}}
注意:
dump可以多次序列化,load亦可以多次读取,但是和顺序有关系,可以忽略,一般不会这样使用。
json的使用
json.dumps,序列化
json.loads,反序列化
import json
data = {
"stu_info_01": {
"stu_name": "Jack",
"stu_age": 12,
"stu_score": 90,
"stu_level": "优"
},
"stu_info_02": {
"stu_name": "Black",
"stu_age": 11,
"stu_score": 80,
"stu_level": "良好"
}
}
print(data)
print(type(data))
dumps_data = json.dumps(data)
print(dumps_data)
print(type(dumps_data))
loads_data = json.loads(dumps_data)
print(loads_data)
print(type(loads_data))
结果:
{'stu_info_01': {'stu_name': 'Jack', 'stu_age': 12, 'stu_score': 90, 'stu_level': '优'}, 'stu_info_02': {'stu_name': 'Black', 'stu_age': 11, 'stu_score': 80, 'stu_level': '良好'}}
<class 'dict'>此处为原数据格式
{"stu_info_01": {"stu_name": "Jack", "stu_age": 12, "stu_score": 90, "stu_level": "\u4f18"}, "stu_info_02": {"stu_name": "Black", "stu_age": 11, "stu_score": 80, "stu_level": "\u826f\u597d"}}
<class 'str'>,此处为序列化后格式
{'stu_info_01': {'stu_name': 'Jack', 'stu_age': 12, 'stu_score': 90, 'stu_level': '优'}, 'stu_info_02': {'stu_name': 'Black', 'stu_age': 11, 'stu_score': 80, 'stu_level': '良好'}}
<class 'dict'>,此处为反序列化后格式
写入文件,json.dump(data, f)
import json
data = {
"stu_info_01": {
"stu_name": "Jack",
"stu_age": 12,
"stu_score": 90,
"stu_level": "优"
},
"stu_info_02": {
"stu_name": "Black",
"stu_age": 11,
"stu_score": 80,
"stu_level": "良好"
}
}
f = open("data.json", "w")
json.dump(data, f)
f.close()
读取文件,json.load(f)
import json
f = open("data.json", "r")
data_read = json.load(f)
f.close()
print(data_read)
print(type(data_read))
关注我,二哥带来更多精品。