pickle.loads和pickle.dumps

pickle(泡菜)pickle.loads和pickle.dumps

该pickle模块实现了用于序列化和反序列化python对象结构的二进制协议。 “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。

举个例子:

import pickle
li = [1, 2, 3]
p = pickle.dumps(li)
print(type(p))
print(p)
.......
<class 'bytes'>
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'

这里dumps()就是把任意对象序列化为一个bytes,让它转化后保存到内存中.
同样反过来,就是反序列化,把bytes流转化为我们可以看懂的char

p = pickle.loads(d)
print(type(p))
print(p)
......
<class 'list'>
[1, 2, 3]

pickle.load和pickle.dump

这种是操作文件使用的,使用过json.dump这类属性的应该明白
举个例子
转化为字节流写入文件

# 在dump()括号中按ctrl+p可以看到提示,第一个属性就是file对象,而dumps()第一个是bytes_object属性
f = open('dump.txt', 'wb')
pickle.dump(d, f)
f.close()
......
�C�]q (KKKe.q .

把字节流转化为普通字节

f = open('dump.txt', 'rb')
d = pickle.load(f)
f.close()
......
[1, 2, 3]

与json比较

pickle协议和JSON之间存在根本区别 :

  • json是一种文本序列化格式,它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式;
  • JSON是人类可读的,而pickle则不是;
  • JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
  • 默认情况下,JSON只能表示Python内置类型的子集,而不能表示自定义类; pickle可以表示极其庞大的Python类型(其中许多是自动的,通过巧妙地使用Python的内省工具;复杂的案例可以通过实现特定的对象API来解决)。

目前有5种不同的方案可用于酸洗。协议使用的越高,读取生成的pickle所需的Python版本就越新。

  • 协议版本0是原始的“人类可读”协议,并且向后兼容早期版本的Python。
  • 协议版本1是旧的二进制格式,它也与早期版本的Python兼容。
  • 在Python 2.3中引入了协议版本2。它提供了更有效的新式类型的酸洗。参考PEP 307获取有关协议2带来的改进的信息。
  • 在Python 3.0中添加了协议版本3。它具有对bytes对象的显式支持, 并且不能被Python 2.x打开。这是默认协议,需要与其他Python 3版本兼容时的推荐协议。
  • 在Python 3.4中添加了协议版本4。它增加了对非常大的对象的支持,挑选更多种类的对象,以及一些数据格式优化。参考PEP 3154获取有关协议4带来的改进的信息。
  • https://docs.python.org/3/library/pickle.html#module-pickle

你可能感兴趣的:(python)