关于python中的pickle函数

本文介绍了使用Python进行文件操作的基本方法,包括读写文件及使用pickle模块进行数据的序列化与反序列化过程。通过实例展示了如何将列表或元组等数据结构保存到文件中,并从中读取数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8-7参考阅读 - 读文件、写文件、异常处理、文件保存游戏、pickle
数据转成文本的过程又被称为“序列化”,即将对象状态转换为可保持或传输的格式的过程。
对应的,从序列化的格式中解析对象状态的过程被称为“反序列化”。

import pickle#序列化,反序列化,所以文件中的内容要求是列表或元组

test_data = ["save me",123.456,True]
f = open("test_2.txt","w")
pickle.dump(test_data,f)#存储文件中的数据
f.close()

f = open("test_2.txt")#文件内容必须为pickle能够识别的
test_data = pickle.load(f)
f.close()
print test_data#取文件中的数据

转载于:https://www.cnblogs.com/Gogo-ouchen/p/7106881.html

### Python 中 `pickle` 模块的使用方法 #### 什么是 `pickle`? `pickle` 是 Python 提供的一个用于对象序列化和反序列化的标准库模块。它能够将复杂的 Python 对象转换为字节流(即序列化),并可以从字节流恢复原始对象(即反序列化)。这使得存储和传输复杂数据结构变得简单。 #### 基本概念 - **序列化**:将 Python 对象转换为字节流以便于保存到文件或通过网络传输。 - **反序列化**:从字节流还原成原来的 Python 对象。 --- #### 主要函数说明 1. **`pickle.dump(obj, file)`** - 将一个 Python 对象序列化后写入文件。 - 参数解释: - `obj`: 要被序列化的对象。 - `file`: 文件对象,通常以二进制模式打开 (`'wb'`)。 - 示例代码如下: ```python import pickle data = {'key': 'value'} with open('data.pkl', 'wb') as f: pickle.dump(data, f) ``` 2. **`pickle.load(file)`** - 从文件中读取序列化的对象并将其反序列化。 - 示例代码如下: ```python import pickle with open('data.pkl', 'rb') as f: loaded_data = pickle.load(f) print(loaded_data) # 输出: {'key': 'value'} ``` 3. **`pickle.dumps(obj)`** - 将一个 Python 对象序列化为字符串形式(通常是 bytes 类型)。 - 示例代码如下: ```python import pickle obj = [1, 2, 3] serialized_obj = pickle.dumps(obj) print(serialized_obj) # 输出类似于 b'\x80\x04\x95...' ``` 4. **`pickle.loads(bytes_object)`** - 从字符串形式(通常是 bytes 类型)反序列化回 Python 对象。 - 示例代码如下: ```python import pickle serialized_obj = b'\x80\x04\x95\x17\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.' deserialized_obj = pickle.loads(serialized_obj) print(deserialized_obj) # 输出: [1, 2, 3] ``` --- #### 序列化与反序列化的实际应用 ##### 场景一:保存和加载对象至/从文件 ```python import pickle # 创建一个列表对象 original_list = ['apple', 'banana', 'cherry'] # 序列化并将对象保存到文件 with open('list.pkl', 'wb') as f: pickle.dump(original_list, f) # 从文件中加载并反序列化对象 with open('list.pkl', 'rb') as f: restored_list = pickle.load(f) print(restored_list) # 输出: ['apple', 'banana', 'cherry'] ``` ##### 场景二:在网络通信中传递对象 假设有一个客户端和服务端之间的通信场景,服务端发送了一个 Python 字典给客户端: 服务端代码: ```python import socket import pickle data_to_send = {"status": "OK", "message": "Connection successful"} serialized_data = pickle.dumps(data_to_send) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.connect(('localhost', 12345)) server_socket.sendall(serialized_data) server_socket.close() ``` 客户端代码: ```python import socket import pickle client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.bind(('localhost', 12345)) client_socket.listen() conn, addr = client_socket.accept() received_data = conn.recv(4096) deserialized_data = pickle.loads(received_data) print(deserialized_data) # 输出: {'status': 'OK', 'message': 'Connection successful'} conn.close() client_socket.close() ``` --- #### 注意事项 1. **安全性问题** 不建议对不可信的数据源使用 `pickle` 进行反序列化操作,因为恶意构造的 `pickle` 数据可能会执行任意代码[^5]。 2. **跨版本兼容性** 如果在不同的 Python 版本之间交换 `pickle` 数据,可能遇到不兼容的情况。因此,在设计长期存储方案时需谨慎考虑这一点。 3. **性能优化** 当处理大规模数据时,可以选择更高的协议版本(如 protocol=4 或更高)来提升效率[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值