Python学习笔记-常用模块介绍--序列化与反序列化
1.序列化和反序列化是什么意思?
- 存东西到硬盘,我们知道,python可以把字符串,当做数据传进去。
- 那么python可以把字典,列表这些类型存进去吗?不可以。
- 所以,需要把字典,列表等类型转换为字符串,再存进去,这个过就是序列化。
-
举个栗子1--序列化:
-
dic = {"name":"liqi"} with open("a.txt",mode="wt",encoding="utf-8") as f: # f.write(dic) # 这样写,会报错 TypeError: write() argument must be str, not dict f.write(str(dic))
- 举个栗子2--反序列化:
-
with open("a.txt",mode="rt",encoding="utf-8") as f: res = f.read() print(res,type(res)) # res_new = dict(res) # 这样不可以转换 # print(res_new, type(res_new)) # ValueError: dictionary update sequence element #0 has length 1; 2 is required res_new = eval(res) # eval是把字符串里的字符运行一下 print(res_new, type(res_new)) # {'name': 'liqi'} <class 'dict'>
2.游戏里的存档是怎么是实现的?
- 游戏就是程序
- 程序=代码+数据
- 代码是不变的,数据是变化的。
- 所以,存档,存的就是数据。
- 举个栗子:
- 植物大战僵尸,存档就是存的数据。原先有10个向日葵,后来有了20个,存档改变的就是数据。
3.序列化的应用场景?(其实就是保存数据的场景)
- 游戏存档
- VMware的挂起
- 跨平台交互数据
4.如何跨平台交互数据?
- 需求: 有1个大项目,用java开发了A模块,python开发了B模块,AB模块想要交互数据,是如何交互的?
- 引入json格式,作为一个通用的数据格式。
-
-
5. josn格式和pickle格式有什么区别?
-
json
-
- 优点:可以跨平台,语言间的共性类型都可以转换。
- 缺点:比如python里的元组类型不支持
- 应用场景:跨平台
- 使用频率:高 (跨平台场景多)
-
pickle
- 优点:python里的所有元素都支持
- 缺点:只能python内部使用,不能跨平台。
- 应用场景:python内部存档
- 使用频率:低
6.json的基本使用。
- json.dumps( python数据 )
- 示例
-
dic = {'name':"liqi","bool":True,"list":[1,2.3]} dic_json = json.dumps(dic) print(dic_json,type(dic_json)) # 结果 {"name": "liqi", "bool": true, "list": [1, 2.3]} <class 'str'>
-
注意:json格式没有单引号,json里的布尔值为true 和 null
- json.loads( json数据 )
- 示例
-
# 反序列化 with open("a.json",mode="rt",encoding="utf-8") as f: res = f.read() dic = json.loads(res) print(dic) # {'name': 'liqi', 'bool': True, 'list': [1, 2.3]}
-
- json.dump() # 不加s
- 示例
-
dic = {'name':"liqi","bool":True,"list":[1,2.3]} json.dump(dic,open("b.json",mode="wt",encoding="utf-8")) # 可以一步到位,写入文件
-
json.load() # 不加s
- 示例
-
res = json.load(open("b.json",mode="rt",encoding="utf-8")) print(res)
7.序列化后的结果,一定要写到文件了吗?
- 不一定。
- 把数据类型转换为json格式叫序列化。
- 存不存进硬盘,都无所谓。跟序列化没关系。
-
8.pickle用法。
- 跟json差不多
- 示例:
-
import pickle res = pickle.dumps({1,2,3,4}) # print(res) # b'\x80\x04\x95\r\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03K\x04\x90.' pickle.dump({1,2,3},open("c",mode="wb"))
- 示例:
-
s = pickle.load(open("c",mode="rb")) print(s,type(s)) # {1, 2, 3} <class 'set'>
- 参考:https://www.cnblogs.com/linhaifeng/articles/6384466.html#_label6
参考资料:https://www.cnblogs.com/linhaifeng/articles/6384466.html