首页 » 编程 » Python-4.常用模块 » 正文

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转为字符串后还是在内存里。

那只是把数据类型转成字符串存到内存里有什么意义?

  1. 把你的内存数据 通过网络 共享给远程其他人;
  2. 定义了不同语言之间的交互规则,交互规则3种方式:
    1. 纯文本,坏处是不能共享复杂的数据类型
    2. xml,坏处是占空间大
    3. 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中用,存储数据占空间大

 

发表评论

验证码加载中....