一、json主要用于传输数据,而pickle主要用于存储数据
二、json序列化后为str类型,而pickle序列化后为bytes类型
三、pickle打开文件或者读取文件的时候需要以二进制的形式打开,而json以文本形式打开
四、json中的dump可以多次连续序列化并写入,但是没有分隔符;load只能从文件中一次性读取并反序列化一次,但是loads可以多次连续读取数据并反序列化,可由于dump没有分隔符,如果多次写入load因为其只能一次性读取全部,且多次写入的数据连在一起,无法正确解析所以造成错误,虽然可以通过每次dump写入后加入换行符的形式来让loads成功多次读取,但是如果在一行的情况下loads也无能为力。而pickle中dump有分隔符,所以无论是loads还是load都可以成功读取,成功解析。
举几个例子:
如果用json的dump写入文件,代码如下:
import json
dic1 = {"a": 1, "b": 2}
dic2 = {"c": 3, "d": 4}
with open("test.txt", mode="w", encoding="utf-8") as fp:
json.dump(dic1, fp)
json.dump(dic2, fp)
with open("test.txt", mode="r", encoding="utf-8") as fp:
dic = json.load(fp)
print(dic)
我们创建的test.txt内容为:
{"a": 1, "b": 2}{"c": 3, "d": 4}
而运行上面的程序会报错,错误信息为:
json.decoder.JSONDecodeError: Extra data: line 1 column 17 (char 16)
说明反序列化错误。
原因,因为load是一次性读取,而dump写入的时候没有分隔符,一般来说多个集合之间应该用符号隔开的,如果连在一起会报错,所以这就是上面错误的原因。
假设我们再用json中的loads读取文件。虽然loads不能读取文件,但是可以稍加修改,代码如下:
import json
dic1 = {"a": 1, "b": 2}
dic2 = {"c": 3, "d": 4}
with open("test.txt", mode="w", encoding="utf-8") as fp:
json.dump(dic1, fp)
# 在后面加入换行符,使其之间有分隔符
fp.write('\n')
json.dump(dic2, fp)
fp.write('\n')
with open("test.txt", mode="r", encoding="utf-8") as fp:
# 虽然loads不能读取文件,但是可以稍加修改
for i in fp:
dic = json.loads(i)
print(dic)
此时test.txt文件里的内容为:
{“a”: 1, “b”: 2}
{“c”: 3, “d”: 4}
最后输出的结果也是这个:
{‘a’: 1, ‘b’: 2}
{‘c’: 3, ‘d’: 4}
但是,如果dump后的数据在一行的话,那么不管是load还是loads都没有办法,因为没有分隔符,不知道在哪里分割,因此我们就需要用到pickle中的dump了
import pickle
dic1 = {"a": 1, "b": 2}
dic2 = {"c": 3, "d": 4}
with open("test.txt", mode="wb") as fp:
pickle.dump(dic1, fp)
pickle.dump(dic2, fp)
with open("test.txt", mode="rb") as fp:
dic1 = pickle.load(fp)
dic2 = pickle.load(fp)
print(dic1)
print(dic2)
此时test.txt内容为:
�� }�(�a�K�b�Ku.�� }�(�c�K�d�Ku.
输出结果为:
{‘a’: 1, ‘b’: 2}
{‘c’: 3, ‘d’: 4}