当前位置: 首页 > 工具软件 > jsonpickle > 使用案例 >

python中pickle和json区别

王楚青
2023-12-01

一、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}

 类似资料: