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
| 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"])
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可以,其引用方法如下:
二、json序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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"])
|