python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python pickle库

python中pickle库用法举例详解

作者:MzKyle

pickle模块是Python标准库中用于对象序列化和反序列化的模块,它可以将Python对象转换为字节流,也可以将字节流转换回Python对象这,篇文章主要介绍了python中pickle库用法的相关资料,需要的朋友可以参考下

pickle库

pickle 是 Python 标准库中的一个模块,它可以将 Python 对象(如列表、字典、类实例等)转换为字节流,这个过程称为“序列化”;反之,也可以将字节流转换回 Python 对象,这个过程称为“反序列化”。:

1. 导入 pickle 模块

在使用 pickle 模块之前,需要先导入它:

import pickle

2. 序列化(pickle.dump() 和 pickle.dumps())

2.1 pickle.dumps()

pickle.dumps() 函数用于将 Python 对象序列化为字节流,返回一个字节对象。

import pickle

data = {'name': 'Alice', 'age': 25}
# 序列化对象
serialized_data = pickle.dumps(data)
print(type(serialized_data))  # <class 'bytes'>
print(serialized_data)

2.2 pickle.dump()

pickle.dump() 函数用于将 Python 对象序列化并直接写入文件对象。

import pickle

data = [1, 2, 3, 4, 5]
# 打开一个文件以二进制写入模式
with open('data.pickle', 'wb') as file:
    # 将对象序列化并写入文件
    pickle.dump(data, file)

3. 反序列化(pickle.load() 和 pickle.loads())

3.1 pickle.loads()

pickle.loads() 函数用于将字节流反序列化为 Python 对象。

import pickle

data = {'name': 'Bob', 'age': 30}
serialized_data = pickle.dumps(data)
# 反序列化字节流
deserialized_data = pickle.loads(serialized_data)
print(deserialized_data)  # {'name': 'Bob', 'age': 30}

3.2 pickle.load()

pickle.load() 函数用于从文件对象中读取字节流并反序列化为 Python 对象。

import pickle

# 打开一个文件以二进制读取模式
with open('data.pickle', 'rb') as file:
    # 从文件中读取并反序列化对象
    loaded_data = pickle.load(file)
    print(loaded_data)  # [1, 2, 3, 4, 5]

4. 支持的对象类型

pickle 可以处理大多数 Python 内置对象类型,包括:

5. 不支持的对象类型

6. 协议版本

pickle 支持多个协议版本,不同的协议版本在性能和兼容性上有所不同。可以通过 pickle.HIGHEST_PROTOCOL 获取当前 Python 版本支持的最高协议版本,也可以在 dump() 和 dumps() 函数中指定协议版本。

import pickle

data = {'key': 'value'}
# 使用最高协议版本进行序列化
serialized_data = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)

7. 安全性问题

pickle 反序列化操作存在安全风险,因为它可以执行任意代码。如果从不可信的源接收 pickle 数据,可能会导致代码注入攻击。因此,在反序列化数据时,要确保数据来源是可信的。

8. 与 json 模块的比较

9. 示例:序列化和反序列化自定义类实例

import pickle

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

    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

# 创建一个 Person 类的实例
person = Person('Charlie', 35)

# 序列化实例
serialized_person = pickle.dumps(person)

# 反序列化实例
deserialized_person = pickle.loads(serialized_person)
print(deserialized_person)  # Person(name=Charlie, age=35)

序列化

序列化是将对象的状态信息转换为可以存储或传输的形式(如字节序列、文本等)的过程。在不同的应用场景中,序列化发挥着重要的作用,以下从几个方面详细介绍序列化的作用:

1. 数据持久化

import pickle

class Player:
    def __init__(self, name, level):
        self.name = name
        self.level = level

# 创建一个玩家对象
player = Player("Alice", 10)

# 将玩家对象序列化并保存到文件
with open('player_data.pickle', 'wb') as file:
    pickle.dump(player, file)

# 下次启动程序时,从文件中读取并反序列化对象
with open('player_data.pickle', 'rb') as file:
    loaded_player = pickle.load(file)
    print(f"Player name: {loaded_player.name}, Level: {loaded_player.level}")

2. 数据传输

import socket
import pickle

# 服务器端
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(1)

print("Waiting for a connection...")
conn, addr = server_socket.accept()
print(f"Connected by {addr}")

# 接收序列化的数据
data = conn.recv(1024)
# 反序列化数据
received_object = pickle.loads(data)
print(f"Received object: {received_object}")

conn.close()

# 客户端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8888))

# 要发送的对象
data_to_send = {'message': 'Hello, server!'}
# 序列化对象
serialized_data = pickle.dumps(data_to_send)
# 发送序列化的数据
client_socket.sendall(serialized_data)

client_socket.close()

3. 数据共享与协作

4. 缓存和优化

综上所述,序列化在数据持久化、传输、共享和缓存等方面都有着重要的作用,是现代软件开发中不可或缺的技术之一。

总结

到此这篇关于python中pickle库用法的文章就介绍到这了,更多相关python pickle库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文