python——pickle模块的详解

介绍

  • pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议

  • “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。

  • pickle协议和JSON(JavaScript Object Notation)的区别 :

    1. JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式;
    2. JSON是人类可读的,而pickle则不是;
    3. JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
  • pickle可以表示极其庞大的Python类型(其中许多是自动的,通过巧妙地使用Python的内省工具;复杂的案例可以通过实现特定的对象API来解决)。
  • pickle 数据格式是特定于Python的。它的优点是没有外部标准强加的限制, 但是这意味着非Python程序可能无法重建pickled Python对象。

API

dumps()

  • 序列化对象层次结构。
1
pickle.dump(obj,file,protocol = None,*,fix_imports = True )

将obj对象的编码pickle编码表示写入到文件对象中。

1
pickle.load(file,*,fix_imports = True,encoding =“ASCII”,errors =“strict” )

从打开的文件对象 文件中读取pickle对象表示,并返回其中指定的重构对象层次结构。

1
pickle.dumps(obj,protocol = None,*,fix_imports = True )

将对象的pickled表示作为bytes对象返回,而不是将其写入文件。

1
pickle.loads(bytes_object,*,fix_imports = True,encoding =“ASCII”,errors =“strict” )

从bytes对象读取pickle对象层次结构并返回其中指定的重构对象层次结构。

loads()

  • 对数据流进行反序列化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import pickle
import io

if __name__ == '__main__':
path = 'test'
f = open(path, 'wb')
data = {'a':123, 'b':'ads', 'c':[[1,2],[3,4]]}
pickle.dump(data, f)
f.close()

f1 = open(path, 'rb')
data1 = pickle.load(f1)
print(data1)