一、什么是序列化
在我们存储数据或者⽹络传输数据的时候,需要对我们的对象进⾏处理。 把对象处理成⽅便存储和传输的数据格式,这个过程叫序列化。不同的序列化,结果也不同,但是⽬的是⼀样的,都是为了存储和传输。
二、 pickle
pickle⽤起来很简单,说⽩了, 就是把我们的python对象写入到⽂件中的⼀种解决⽅案。但是写入到⽂件的是bytes,所以这东⻄不是给⼈看的,是给机器看的。
import pickle
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
def catchMouse(self):
print(self.name, "抓⽼⿏")
c = Cat("jerry", 18)
bs = pickle.dumps(c) # 序列化⼀个对象.
print(bs) # ⼀堆⼆进制. 看不懂
cc = pickle.loads(bs) # 把⼆进制反序列化成我们的对象
cc.catchMouse() # 猫依然是猫. 还可以抓⽼⿏
pickle中的dumps可以序列化⼀个对象. loads可以反序列化⼀个对象. 我们使⽤dump
还可以直接把⼀个对象写入到⽂件中
# f = open("cat", mode="wb")
# pickle.dump(c, f) # 写⼊到⽂件中
# f.close()
f = open("cat", mode="rb")
cc = pickle.load(f) # 从⽂件中读取对象
cc.catchMouse()
要是存储多个对象呢,很简单,装list⾥,然后读取和写入都⽤list。
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)]
f = open("cat", mode="wb")
pickle.dump(lst, f)
f = open("cat", mode="rb")
ll = pickle.load(f)
for el in ll:
el.catchMouse()
三、 json
终于到json了, json是我们前后端交互的枢纽。相当于编程界的普通话,⼤家沟通都⽤json。为什么这样呢? 因为json的语法格式可以完美的表⽰出⼀个对象,那什么是json?json全称javascript object notation,翻译过来叫js对象简谱,看看使用方法:
import json
dic = {"a": "张三", "b": "李四", "c": "王五"}
s = json.dumps(dic) # 把字典转化成json字符串
print(s)
结果:
{"a": "\u5f20\u4e09", "b": "\u674e\u56db", "c": "\u738b\u4e94"}
结果很不友好啊,那如何处理中⽂呢? 在dumps的时候给出另⼀个参数ensure_ascii=False就可以了。
import json
dic = {"a": "张三", "b": "李四", "c": "王五"}
s = json.dumps(dic,ensure_ascii=False) # 把字典转化成json字符串
print(s)
运行后结果:
{"a": "张三", "b": "李四", "c": "王五"}
上面是把字典转为了字符串,下面再转回来:
import json
s = '{"a": "张三", "b": "李四", "c": "王五"}'
dic = json.loads(s)
print(type(dic), dic)
结果:
<class 'dict'> {'a': '张三', 'b': '李四', 'c': '王五'}
很简单的就把数据转过来了,两个函数,dumps 和 loads 实现了互相的转换。
同样也可以从⽂件中读取⼀个json:
dic = {"a": "张三", "b": "李四", "c": "王五"}
f = open("test.json", mode="w", encoding="utf-8")
json.dump(dic, f, ensure_ascii=False) # 把对象打散成json写⼊到⽂件中
f.close()
同样也可以从⽂件中读取⼀个json:
f = open("test.json", mode="r", encoding="utf-8")
dic = json.load(f)
f.close()
print(dic)