json & pickle模块
序列化 与 反序列化
序列化:把内存里的数据类型转变成字符串,叫序列化,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes
反序列化:把字符转成内存数据类型,叫反序列化
为什么要序列化?
试想一下,你正在玩游戏,但是中途有事情,不得不中断游戏去做你的事情,但是你又想回来的时候接着中断的地方开始继续游戏,怎么才能做到呢?这时候就需要将游戏里的各种状态数据以某种形式保存下来,下次打开的时候加载保存下来的数据就可以继续愉快玩耍了。至于怎么存呢?存字典吗,由于游戏里可能数据类型很多,用字典可能存不了,所以我们通常用 json 和 pickle来做序列化,将数据存到硬盘上。
用于序列化的两个模块:
- json,用于字符串 和 python数据类型间进行转换
- pickle,用于python特有的类型和python的数据类型间进行转换
json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json模块:
json模块 dumps 和 loads:
import json
data = {"k1": "123", "k2": "Hello"}
# json dumps: 将内存数据转换为所有程序语言都认识的字符串(json)
j_str = json.dumps(data)
print(j_str) # 输出:{"k1": "123", "k2": "Hello"}
# json loads:将字符串转为内存数据类型
d = json.loads(j_str)
print(d) # 输出:{'k1': '123', 'k2': 'Hello'}
有没有发现,data本来就是在内存中,通过dumps转为字符串后还是在内存里。
那只是把数据类型转成字符串存到内存里有什么意义?
- 把你的内存数据 通过网络 共享给远程其他人;
- 定义了不同语言之间的交互规则,交互规则3种方式:
- 纯文本,坏处是不能共享复杂的数据类型
- xml,坏处是占空间大
- json,简单,可读性好
json模块 dump 和 load:
import json
data = {"k1": "123", "k2": "Hello"}
# json dump: 将内存数据转为字符串并存到硬盘上 E:\data.json
with open("E:\\data.json", "w", encoding="utf-8") as fj:
json.dump(data, fj)
# json load: 将硬盘上的数据读到内存
with open("E:\\data.json", "r", encoding="utf-8") as fj:
d = json.load(fj)
print(d) # 输出:{'k1': '123', 'k2': 'Hello'}
注意:不要多次dump,虽然多次dump不会报错,但是load的时候会出错。
pickle模块:
pickle和json用法完全一样。
pickle模块dumps 和 loads:
import pickle
data = {"k1": 123, "k2": "Hello"}
# pickle dumps: 将数据转换为只有python才能认识的字符串
p_str = pickle.dumps(data)
print(p_str)
# 上面输出:b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01K{X\x02\x00\x00\x00k2q\x02X\x05\x00\x00\x00Helloq\x03u.'
# pickle loads:将只能由python认识的字符串转为内存数据
d = pickle.loads(p_str)
print(d)
# 上面输出:{'k1': 123, 'k2': 'Hello'}
pickle模块dump和load:
import pickle
data = {"k1": 123, "k2": "Hello"}
# 将数据转为只有python才认识的字符串并存到文件中
with open("E:/data.pkl", "wb") as fp:
pickle.dump(data, fp)
# 从文件中将数据读取到内存
with open("E:/data.pkl", "rb") as fp:
d = pickle.load(fp)
print(d)
# 以上输出:{'k1': 123, 'k2': 'Hello'}
json 和 pickle 的优缺点:
json
优点:跨语言、体积小
缺点:只支持 int, str, list, tuple, dict
pickle
优点:专为python设计,支持python所有数据类型
缺点:只能在python中用,存储数据占空间大
共有 0 条评论