python pickle模块.md

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 。

Life is more than the present.