Pickle

介绍

Pickle 主要用于序列化和反序列化 Python 对象结构。 换句话说,它是将 Python 对象转换为字节流,从而可以将其:

  • 存储在文件/数据库中
  • 通过网络传输
  • 跨会话维护程序状态

字节流(Byte Stream): 一个字节的序列 (1个字节=8个比特)
比特流(Bit Stream):一个比特的序列
比特:0或1

Pickle之后的文件后缀为*.pkl。该文件中不仅包括了原始数据,还包括了如何unpickle的指令和信息。

可pickle的数据类型

  • None
  • 布尔值(true, false)
  • 数(Integers, long integers, floating point numbers, complex numbers)
  • 字符串(Normal, Unicode)
  • 元组、列表、集合和字典(Tuples, lists, sets, and dictionaries containing only picklable objects)
  • 在模块顶层定义的函数(functions)
  • 在模块顶层定义的内置函数(Built-in functions)
  • 在模块顶层定义的类(classes)

pickle模块常用方法

使用场景方法
用于pickle的方法pickle.dump(...)生成字符串放到一个文件里
pickle.dumps(...)只生成一个字符串(多出来的s=string
用于unpickle的方法pickle.load(...)unpickle一个文件
pickle.loads(...)unpickle一个字符串

举例:pickle字符串

import pickle

class example_class:
    a_number = 35
    a_string = "hey"
    a_list = [1, 2, 3]
    a_dict = {"first": "a", "second": 2, "third": [1, 2, 3]}
    a_tuple = (22, 23)

my_object = example_class()

# (1)Pickling the object
my_pickled_object = pickle.dumps(my_object)  
print(f"(1) Pickling:\n{my_pickled_object}\n")


# (2)Unpickling the object
my_unpickled_object = pickle.loads(my_pickled_object)  
print(
    f"(2) Unpickling: 尝试打印object中的dict:\n{my_unpickled_object.a_dict}\n")

结果如下:

(1) Pickling:
b'\x80\x04\x95!\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\rexample_class\x94\x93\x94)\x81\x94.'

(2) Unpickling: 尝试打印object中的dict:
{'first': 'a', 'second': 2, 'third': [1, 2, 3]}

举例:pickle *.pkl 文件

# (1) Pickling
class example_class:
    a_number = 35
    a_string = "hey"
    a_list = [1, 2, 3]
    a_dict = {"first": "a", "second": 2, "third": [1, 2, 3]}
    a_tuple = (22, 23)

my_object = example_class()

with open('data/test.csv', 'wb') as f:
    test_data = pickle.dump(my_object, f)
    
print(f"(1) Pickling")

# (2) Unpickling
with open('data-train.pkl', 'rb') as f:
    unpickled_data = pickle.load(f)
print(f"(2) Unpickling:\n{unpickled_data}\n")

输出结果:生成test.pkl文件并且输出以下结果:

(1) Pickling:
(2) Unpickling:
{'first': 'a', 'second': 2, 'third': [1, 2, 3]}

比较:Pickle vs JSON

Pickle压缩(比如zip)
格式二进制序列化格式文本序列化格式(utf-8编码)
可读性人类不可读人类可读
适用范围只适用于python广泛应用于其他场景,远不止python
对python数据类型的表达可用于表达大多数python数据类型只能表达默认的python内置数据类型

比较:Pickle vs 压缩(比如zip)

这两个概念有时会被弄混。但两者其实没有可比性。

Pickle压缩(比如zip)
将对象从一种表示形式(随机存取存储器 (RAM) 中的数据)转换为另一种表示形式(磁盘上的文本)使用较少位对数据进行编码的过程,以节省磁盘空间

更多推荐

Python :pickle存储和读取数据