今天我们学习一下什么是序列化与反序列化,然后再简单的学习一下pickle模块、Json模块、msgpack模块的使用~
1.什么是序列化与反序列化?
首先什么是序列化呢,将内存中的数据转换为字节序列保存到文件这就是序列化,而反序列化就是将字节序列的文件中的内容恢复到内存中;
2.pickle模块的使用
(1)如何序列化写入文件:
import pickle
list = [1, 2, 3, 4, 5]
dicty = {'name': '可可', 'age': 20}
with open(file='test.txt', mode='wb') as f:
pickle.dump(list, f)
pickle.dump(dicty, f)
with open(file='test.txt', mode='rb') as f:
for line in f:
print(line)
- 导入pickle模块;
- 初始化数据结构;
- 通过with open上下文管理器的方式打开文件(文件操作模式为只写二进制模式);
- 然后使用pickle模块中的dump方法对数据结构序列化,并且将之写入文件;
(2)读取文件序列化内容
- 通过
with open
上下文管理器的方式打开文件(文件操作模式为只读二进制模式); - 使用pickle模块的load方法将文件内序列化好的对象加载到内存中,将之还原;
(3)序列化Python对象
import pickle
def add(x, y):
print(x + y)
class Add:
def __init__(self):
print('hello')
serialise_obj1 = pickle.dumps(add)
serialise_obj2 = pickle.dumps(Add)
print(serialise_obj1)
print(serialise_obj2)
new_add = pickle.loads(serialise_obj1)
new_Add = pickle.loads(serialise_obj2)
print(new_add)
print(new_Add)
print(new_add(1,2))
print(new_Add())
-
dumps方法
:直接序列化Python对象,对象序列化后以 bytes 对象返回,不写入文件; -
loads方法
:直接把序列化好对象进行还原,并返回其重组后的对象;
(4)序列化函数还原
import pickle
def add(x, y):
print(x + y)
with open('test.txt', 'wb') as f:
pickle.dump(add, f)
import pickle
with open('test.txt', 'rb') as f:
new_function = pickle.load(f)
- 将序列化的函数写入文件,到另外一个模块中运行, 必须先在当前这模块声明这个函数;
- 因为序列化还原只会还原函数名,函数对象的语句块不会序列化;
3.Json模块
# json 跨语言的序列化方式,用于存储和展示数据
{
"name": "中国",
"province": [{
"name": "黑龙江",
"cities": {
"city": ["哈尔滨", "大庆"]
}
}, {
"name": "广东",
"cities": {
"city": ["广州", "深圳", "珠海"]
}
}, {
"name": "台湾",
"cities": {
"city": ["台北", "高雄"]
}
}, {
"name": "新疆",
"cities": {
"city": ["乌鲁木齐"]
}
}]
}
# python 与 json对象的转化
import json
dictionary = {
'name': 'Robby',
'age': 27
}
json_obj = json.dumps(dictionary)
print(json_obj)
new_dict = json.loads(json_obj)
print(new_dict)
# json.dump()和json.load() 是将json对象保存到文件
- JSON是一种轻量级的数据交换格式;
- 使用 JSON 函数需要导入 json 模块;
-
json.dumps
:用于将 Python 对象编码成 JSON 字符串; -
json.loads
:用于将已编码的 JSON 字符串解码为 Python 对象,该函数返回 Python 字段的数据类型;
4.msgpack模块
# 需要先安装
# pip install msgpack-python
# 示例
import msgpack
dictionary = {
'name': 'Robby',
'age': 27
}
msgpack_obj = msgpack.packb(dictionary)
print(msgpack_obj)
new_dictionary = msgpack.unpackb(msgpack_obj, )
print(new_dictionary)
print(type(new_dictionary))
- 是一个基于二进制高效的对象化序列类库,可用于跨语言通信;
- 首先需要在项目中安装msgpack模块:
Pip install msgpack-python
,然后再导入使用; -
packb
:将对象序列化成一个二进制对象; -
unpackb
:将对象还原;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。