json&pickle模块
目录
json&pickle模块
1 序列化简介
1.1 什么是序列化
-
把对象(变量)从内存中变成可存储或传输的过程称为序列化
-
在python中叫pickling
-
在其他语言中叫serialization、marshalling、flattening等
1.2 序列化作用
-
持久保持状态
软件/程序的执行就是处理一系列状态的变化。
在编程语言中,'状态'会以变量的形式保存在内存中。
内存无法永久保存数据,断电或重启会被清空。
在断电或重启前将程序内存中所有数据保存到文件中,下次程序执行会在文件中载入之前的数据,然后解释执行,这就是序列化。
-
跨平台数据交互
序列化之后可以将内容写入磁盘,还可以通过网络传输到别的机器上
如果收发双方约定好使用一种序列化格式就打破平台/语言的限制,实现跨平台数据交互
把变量从序列化的对象重新读到内存里称之为反序列化,即unpickling
2 json
2.1 用处及用法
2.1.1 用处
-
把某个语言的变量转成json格式字符串
-
存取数据(格式标准),一个程序写入,另一个程序读取(两程序可以不同语言)
-
后端给前端的数据是json格式字符串
2.1.2 用法
{"name":"ccc","age":18,"handsome":true,"xxx":null}
json类型 | python类型 |
---|---|
{} | dict |
[] | list |
"string" | str |
123.456 | int/float |
true/false | True/False |
null | None |
内存中结构化的数据<---->格式json<---->字符串<---->保存到文件或基于网络传输
2.2 序列化与反序列化
2.2.1 基本使用
-
序列化:把python中的字典、列表、布尔数据类型转为json格式字符串
-
反序列化:把json格式字符串转成某个语言的变量
-
补充:在Java中,处于性能考虑有许多包完成序列化与反序列化(谷歌的gson、阿里开源的fastjson)
2.2.2 序列化
import json # 导入json模块,内置模块
# 定义一个字典
dic = {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None}
# 把字典转换成json格式字符串
dic_str = json.dumps(dic)
print(dic_str, type(dic_str))
# {"name": "ccc", "age": 18, "handsome": true, "xxx": null} <class 'str'>
2.2.3 反序列化
# 定义一个json格式的字符串
s = """
{"name": "ccc", "age": 18, "handsome": true, "xxx": null}
"""
# 把json格式字符串转成字典
s_dic = json.loads(s)
print(s_dic, type(s_dic))
# {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None} <class 'dict'>
2.3 写入文件
2.3.1 序列化
# 复杂写法
dic = {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None}
dic_str = json.dumps(dic)
print(dic_str) # {"name": "ccc", "age": 18, "handsome": true, "xxx": null}
with open('a.json', 'wt', encoding='utf-8') as f:
f.write(dic_str)
# 简化写法
dic = {'name': 'ccc', 'age': 18, 'handsome': True, 'xxx': None}
with open('a.json', 'wt', enncoding='utf-8') as f:
json.dump(dic, f)
2.3.2 反序列化
with open('a.json', 'rt', encoding='utf-8') as f:
dic = json.load(f)
print(dic, type(dic))
2.4 总结
-
序列化 json.dumps()
-
反序列化 json.loads()
-
序列化并保存到文件中 json.dump()
-
从文件反序列化回来 json.load()
补充:
dic = {'name': '曹嘉鑫', 'age': 18, 'handsome': True, 'xxx': None}
print(json.dumps(dic)) # 遇到中文会显示成unicode
print(json.dumps(dic, ensure_ascii=False))
# {"name": "曹嘉鑫", "age": 18, "handsome": true, "xxx": null}
3 pickle
3.1 序列化与按序列化
3.1.1 序列化
import pickle # 内置模块
dic = {'name': 'ccc', 'age': 18}
res = pickle.dumps(dic)
print(res) # 显示成b格式
3.1.2 反序列化
import pickle
b = b'\x80\x04\x95\x1a\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03ccc\x94\x8c\x03age\x94K\x12u.'
res = pickle.loads(b)
print(res, type(res)) # {'name': 'ccc', 'age': 18} <class 'dict'>
3.2 写入文件
3.2.1 序列化
import pickle
dic = {'name': 'ccc', 'age': 18}
with open('a.pkl', 'wb') as f:
pickle.dump(dic, f)
3.2.2 反序列化
import pickle
with open('a.pkl', 'rb') as f:
res = pickle.load(f)
print(res) # {'name': 'ccc', 'age': 18}
4 json与pickle比较
json | pickle |
---|---|
通用格式,任何语言都有,都可以解析 | 仅python使用,转成b格式,其它语言识别不了 |
字典、列表、布尔类型可用 | 任意数据类型都可用 |
import json
import pickle
dic = {'a': input}
res1 = json.dumps(dic)
res2 = pickle.dumps(dic)
print(res1) # 报错,因为json只支持字典、列表和布尔
print(res2) # 转成b格式
dic2 = pickle.loads(res2)
dic2['a']() # input()