视频加载失败

pickle模块介绍

788 字
4 分钟
pickle模块介绍

【一】什么是pickle模块#

  • pickle 模块是 Python 内置的一个序列化和反序列化的模块,它可以将 Python 对象转换为字节流,也可以将字节流转换回 Python 对象。
  • 这些操作通常被称为序列化和反序列化。

【二】序列化和反序列化#

【1】序列化#

  • 序列化是指将 Python 对象转换为可以存储在文件、数据库或者网络传输的数据格式的过程。
  • 序列化后得到的结果通常是字节流形式的数据,这种数据可以方便地进行存储和传输。

【2】反序列化#

  • 反序列化则是指将字节流形式的数据恢复为原来的 Python 对象的过程。
  • 在反序列化过程中,Python 解释器会按照一定的规则解析字节流,并根据字节流的内容创建出与之对应的 Python 对象。

【三】常用的方法介绍#

【1】Python对象和pickle对象互转#

  • pickle 模块提供了一系列的方法和类来实现序列化和反序列化操作。
  • 其中最常用的方法是 pickle.dumps() 和 pickle.loads()。
  • pickle.dumps() 方法接受一个 Python 对象作为参数,返回一个字节流,表示该对象的序列化结果。
  • pickle.loads() 方法接受一个字节流作为参数,返回一个 Python 对象,表示该字节流的反序列化结果。
import pickle
# 【一】将Python中的字典类型序列化成pickle的字节流
# 【1】字典类型
user_dict = pickle.dumps({'name': 'dream'})
print(user_dict, type(user_dict))
# b'\x80\x04\x95\x13\x00\x00\x00\x00\x00\x00\x00}\x94\x8c\x04name\x94\x8c\x05dream\x94s.' <class 'bytes'>
# 【2】字符串类型
user_str = pickle.dumps('hello world')
print(user_str, type(user_str))
# b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8c\x0bhello world\x94.' <class 'bytes'>
# 【3】整数类型
user_int = pickle.dumps(123)
print(user_int, type(user_int))
# b'\x80\x04K{.' <class 'bytes'>
# 【4】浮点数类型
user_float = pickle.dumps(3.14)
print(user_float, type(user_float))
# b'\x80\x04\x95\n\x00\x00\x00\x00\x00\x00\x00G@\t\x1e\xb8Q\xeb\x85\x1f.' <class 'bytes'>
# 【5】布尔类型
user_bool = pickle.dumps(True)
print(user_bool, type(user_bool))
# b'\x80\x04\x88.' <class 'bytes'>
# 【6】元组类型
user_tuple = pickle.dumps((1, 2, 3))
print(user_tuple, type(user_tuple))
# b'\x80\x04\x95\t\x00\x00\x00\x00\x00\x00\x00K\x01K\x02K\x03\x87\x94.' <class 'bytes'>
# 【7】列表类型
user_list = pickle.dumps([1, 2, 3])
print(user_list, type(user_list))
# b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.' <class 'bytes'>
# 【8】集合类型
user_set = pickle.dumps({1, 2, 3})
print(user_set, type(user_set))
# b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03\x90.' <class 'bytes'>

【2】Python对象和pickle对象读写#

import pickle
# 【二】数据的读写
def save_data(path, mode='wb', data=None):
with open(path, mode) as fp:
pickle.dump(data, fp)
print(f'当前已保存!保存路径为:{path}!')
def load_data(path, mode='rb'):
with open(path, mode) as fp:
data = pickle.load(fp)
return data
# 【1】序列化写入 Python独有的类
class Student(object):
def __init__(self, name, age, grade):
self.name = name
self.age = age
self.grade = grade
student = Student('张三', 18, '高三')
# 将实例化好的对象写入到指定文件
# save_data(path='Student', data=student)
# 将保存好的数据读出来,可以直接使用
student_data = load_data(path='Student')
print(student_data) # <__main__.Student object at 0x109277eb0>
print(student_data.name) # 张三
print(student_data.age) # 18

【四】pickle的弊端#

  • 需要注意的是,pickle 模块并不安全,因为它可以序列化任何 Python 对象,包括内置类型、自定义类的对象等。
  • 这使得 pickle 模块有可能成为攻击者攻击的目标。
  • 例如,攻击者可以通过构造恶意的 pickle 数据包,将其发送给受害者,导致受害者执行任意代码。
  • 因此,如果可能的话,应该尽量避免使用 pickle 模块,或者至少要确保输入的数据来自可信的来源。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
300
分类
5
标签
26
总字数
640,882
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录