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存储和读取数据
发布评论