python 常用的序列化库是:pickle,json。但是二者有一定的区别
- JSON 是一个文本序列化格式(它输出 unicode 文本,尽管在大多数时候它会接着以 utf-8 编码),而 pickle 是一个二进制序列化格式;
- JSON 是我们可以直观阅读的,而 pickle 不是;
- JSON是可互操作的,在Python系统之外广泛使用,而pickle则是Python专用的;
- 默认情况下,JSON 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型(可以合理使用 Python 的对象内省功能自动地表示大多数类型,复杂情况可以通过实现 specific object APIs 来解决)
- 不像pickle,对一个不信任的JSON进行反序列化的操作本身不会造成任意代码执行漏洞。
所以,json
可以在不同语言之间交换数据,用于字符串和python数据类型间进行转换。
pickle:
只用于python特有的类型和python的数据类型间进行转换。
其实他们主要四个功能:dumps
、dump
、loads
、load
对于 json
json.dumps(): 对json进行编码,把数据类型转换成字符串。
json.dump():对json进行编码, 把数据类型转换成字符串,并存储在文件中。
json.loads(): 对json进行解码,把字符串转换成数据类型 。
json.load(): 把文件打开,对json进行解码,从字符串转换成数据类型。
保存:
比如我们想保存
A = {
"A":[1, 2, 3],
"B":[3, 4, 5]
}
方法一:
with open("how_to_dump.json","w", encoding="utf8") as f:
json.dump(A, f)
方法二:
with open("how_to_dumps.json","w", encoding="utf8") as f:
tmp = json.dumps(A) # 将数据直接序列化
f.write(tmp)
读取:
方法一:
with open("how_to_dump.json","r", encoding="utf8") as f:
new_A = json.load(f)
方法二:
with open("how_to_dump.json","r", encoding="utf8") as f:
new_A = json.loads(f.read())
对于pickle
也是同样的,但是我们要注意这几点:
-
json
是可以在不同语言之间交换数据的,pickle
只在python
之间使用。 -
json
只能序列化最基本的数据类型,比如列表,字典,字符串,数字;pickle
可以序列化所有的数据类型,包括类,函数等