python标准库之序列化

python标准库中有两个模块可以将对象转换为一种可传输或存储的格式(这个过程被称为序列化),一种是pickle(应用最广泛),一种是json(在基于web的应用较为常见)。

一、pickle序列化

pickle模块实现了一个算法,可以将一个Python对象转换为一系列字节。这个过程被称为序列化。可以传输或存储表示对象的字节流,然后再重新构造来创建有相同性质的新对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# coding=utf-8
import pickle

d = {"a": 1, "b": 2}

# 将对象序列化
data_string = pickle.dumps(d)
print(data_string)

# 传入序列化对象
data = pickle.loads(data_string)
print(data["a"] + data["b"])

########################################

# 将对象序列化到文件, wb表示二进制写入
with open("test.pkl", "wb") as file:
pickle.dump(d, file)

# 从文件还原对象
with open("test.pkl", "rb") as file:
data2 = pickle.load(file)
print(data2["a"] + data2["b"])

除了dumps、loads,pickle还提供了一些便利的函数来处理类似文件的流。
可以向一个流写多个对象,然后从流读取这些对象,而无须事先知道要写多个对象或者这些对象有多大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pickle
import io

d = {"a": 1, "b": 2}
l = [1, 2, 3]
s = {1, 1, 3}
data = [d, l, s]

out_s = io.BytesIO()
for o in data:
pickle.dump(o, out_s)
out_s.flush()

in_s = io.BytesIO(out_s.getvalue())

while True:
try:
o = pickle.load(in_s)
print(o)
except EOFError:
break

有些对象pickle不可以保存,但dill可以,其引用方法如下:

1
import dill as pickle

二、json序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# coding=utf-8
import json

d = {"a": 1, "b": 2}

# 将对象序列化
data_string = json.dumps(d)
print(data_string)

# 传入序列化对象
data = json.loads(data_string)
print(data["a"] + data["b"])

########################################

# 将对象序列化到文件
with open("test.json", "w") as file:
json.dump(d, file)

# 从文件还原对象
with open("test.json", "r") as file:
data2 = json.load(file)
print(data2["a"] + data2["b"])