目录
- 一、json和pickle模块
- 1.1 序列化
- json模块
- 使用json模块
- pickle模块
- 使用pickle模块
一、json和pickle模块
要说json和pickle首先要说序列化
1.1 序列化
把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening。
序列化的优点:
- 持久保存状态:内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。但是在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
- 跨平台数据交互:序列化时不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。
json模块
json序列化并不是python独有的,json序列化在java等语言中也会涉及到,因此使用json序列化能够达到跨平台传输数据的目的。
json数据类型和python数据类型对应关系表
Json类型 | Python类型 |
---|---|
{} | dict |
[] | list |
"string" | str |
520.13 | int或float |
true/false | True/False |
null | None |
json模块序列化和反序列化的一个过程如下图所示
使用json模块
import json
序列化:从python的字典(最常用)变成json串. dump
方法
反序列化:从json串变成python的字典(最常用),load
方法
序列化到内存中
# 序列化到内存中
dic = {'a': 1, 'b': 'abc', 'c': None}
data = json.dumps(dic) # 序列化到内存中
print(data,type(data)) # 单引号全部变成双引号
data = json.loads(data) # 反序列化 从内存中获取json串
print(data,type(data))
{"a": 1, "b": "abc", "c": null}
{'a': 1, 'b': 'abc', 'c': None}
序列化到文件中
# 序列化到文件中
dic = {'a': 1, 'b': 'abc', 'c': None}
with open('47 json.json','w',encoding='utf8') as fw: # 写文件
json.dump(dic,fw) # 序列化到文件,以二进制存储
with open(f'{"47 json"}.json','r',encoding='utf8') as fr: # 读文件
data = json.load(fr) # 反序列化
print(data,type(data))
{'a': 1, 'b': 'abc', 'c': None}
pickle模块
Pickle序列化和所有其他编程语言特有的序列化问题一样,它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,即不能成功地反序列化也没关系。但是pickle的好处是可以存储Python中的所有的数据类型,包括对象,而json不可以。
pickle模块序列化和反序列化的过程如下图所示
使用pickle模块
import pickle
序列化: dump
方法
反序列化:load
方法
序列化到内存中
# 序列化到内存中
dic = {'a': 1, 'b': 'abc', 'c': None}
data = pickle.dumps(dic) # 序列化到内存,以二进制存储
print(data, type(data))
data = pickle.loads(data) # 反序列化回来.字典
print(data, type(data))
b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02X\x03\x00\x00\x00abcq\x03X\x01\x00\x00\x00cq\x04Nu.'
{'a': 1, 'b': 'abc', 'c': None}
序列化到文件中
# 序列化到文件中
dic = {'a': 1, 'b': 'abc', 'c': None}
with open('47 pickle.txt', 'wb') as fw:
pickle.dump(dic, fw) # 序列化到文件,以二进制存储
# 反序列化
with open('47 pickle.txt', 'rb') as fr:
data = pickle.load(fr) # 反序列化
print(data)