pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。
pickle 简介
官网直译:pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。“pickle”是将Python对象层次结构转换为字节流的过程,而“unpickle”是反向操作,即将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。pickle(和反pickle)也称为“序列化”、“编组”、1或“扁平化”;但是,为了避免混淆,这里使用的术语是“pickle”和“unpickle”
pickle和json对比
- JSON是一种文本序列化格式(它输出unicode文本,尽管大多数时候它被编码为utf-8),而pickle是一种二进制序列化格式;
- json可读,pickle不可读,是二进制字节流。
- JSON是可互操作的,在Python生态系统之外广泛使用,而pickle是特定于Python的;
pickle.dump 和 pickle.load
- pickle.dump(obj, file, protocol=None, *, fix_imports=True)
将obj的pickle表示形式写入打开的文件对象文件
- pickle.load(file, *, fix_imports=True, encoding=”ASCII”, errors=”strict”)
从打开的文件对象文件中读取经过pickle的对象表示,并返回其中指定的重新构造的对象层次结构。这相当于Unpickler(file).load()。
pickle.dumps 和 pickle.loads
- pickle.dumps(obj, protocol=None, *, fix_imports=True)
将对象的pickle表示形式作为字节对象返回,而不是将其写入文件。
- pickle.loads(bytes_object, *, fix_imports=True, encoding=”ASCII”, errors=”strict”)
从字节对象中读取已pickle的对象层次结构,并返回其中指定的重新构造的对象层次结构。
代码示例
# 写文件
def write_file(file_path, content):
try:
with open(file_path, 'ab') as f:
pickle.dump(content, f)
except Exception as e:
raise e
# 读文件
def read_file(file_path):
result = None
try:
with open(file_path, 'rb+') as f:
result = pickle.load(f)
f.seek(0) # 清空文件的内容
f.truncate()
return result
except EOFError:
pass
except Exception as e:
raise e
cPickle – A faster pickle
cPickle是用C编码的,在运行效率上比pickle要高,但是cPickle模块中定义的类型不能被继承。 cPickle和pickle的序列化/反序列化规则是一样的,使用pickle序列化一个对象,可以使用cPickle来反序列化。
python3。x cPickle已从cPickle更改为_pickle。
import _pickle as cpickle
pickle.dump(object, file, protocol = True)
dump时如果指定了 protocol 为 True,压缩过后的文件的大小只有原来的文件的30% ,同时无论在 dump 时还是 load 时所耗费的时间都比原来少。因此,一般来说,可以建议把这个值设为 True 。