pickle模块

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


class People(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def my_func(self):
        print(f"我叫{self.name},今年{self.age}岁")
p=People("张三",20)
def save_data(path,data):
    with open(path,mode='wb') as f:
        pickle.dump(data,f)



def read_data(path):
    with open(path,mode='rb') as f:
        data=pickle.load(f)
        return data
p=People("张三",20)
save_data("user",p)
data=read_data('user')
print(data)#读取对象
print(data.name)
print(data.age)
#<__main__.People object at 0x000001D99DB1CEE0>
#张三
#20

【四】pickle的弊端

  • 需要注意的是,pickle 模块并不安全,因为它可以序列化任何 Python 对象,包括内置类型、自定义类的对象等。
  • 这使得 pickle 模块有可能成为攻击者攻击的目标。
  • 例如,攻击者可以通过构造恶意的 pickle 数据包,将其发送给受害者,导致受害者执行任意代码。
  • 因此,如果可能的话,应该尽量避免使用 pickle 模块,或者至少要确保输入的数据来自可信的来源。
posted @ 2024-01-09 19:14  -半城烟雨  阅读(24)  评论(0编辑  收藏  举报