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()
posted @ 2020-12-14 21:46  drrug  阅读(98)  评论(0编辑  收藏  举报