pickle模块用于Python对象的序列化与反序列化,支持复杂对象类型,但仅限于可信环境使用,因反序列化不可信数据可能导致任意代码执行;推荐在纯Python、跨语言需求低且数据源可信的场景中使用,否则应选用JSON等更安全的替代方案。

Python的
pickle
使用
pickle
dump/load
dumps/loads
当你需要将一个Python对象保存到文件(或任何文件状对象)时,可以使用
pickle.dump()
import pickle
data = {
'name': '张三',
'age': 30,
'city': '北京',
'scores': [95, 88, 92]
}
# 序列化到文件
try:
with open('my_data.pkl', 'wb') as f: # 注意这里是'wb',写入二进制模式
pickle.dump(data, f)
print("数据已成功序列化并保存到 my_data.pkl")
except Exception as e:
print(f"序列化失败: {e}")
# 从文件反序列化
try:
with open('my_data.pkl', 'rb') as f: # 注意这里是'rb',读取二进制模式
loaded_data = pickle.load(f)
print("数据已成功从 my_data.pkl 反序列化:")
print(loaded_data)
except FileNotFoundError:
print("文件 my_data.pkl 不存在。")
except Exception as e:
print(f"反序列化失败: {e}")如果你的需求是把对象序列化成一个字节字符串,而不是直接写入文件,那么
pickle.dumps()
pickle.loads()
立即学习“Python免费学习笔记(深入)”;
import pickle
class MyObject:
def __init__(self, value):
self.value = value
def __str__(self):
return f"MyObject(value={self.value})"
obj = MyObject(123)
another_data = {'id': 1, 'object': obj}
# 序列化为字节串
pickled_bytes = pickle.dumps(another_data)
print(f"序列化后的字节串: {pickled_bytes}")
# 从字节串反序列化
unpickled_data = pickle.loads(pickled_bytes)
print(f"反序列化后的数据: {unpickled_data}")
print(f"反序列化后的对象类型: {type(unpickled_data['object'])}")
print(f"反序列化后的对象值: {unpickled_data['object'].value}")pickle
谈到
pickle
pickle
为什么会这样呢?因为
pickle
所以,我的建议是:永远不要反序列化来自不可信源的pickle
pickle
pickle
pickle
pickle
pickle
然而,这并不是没有限制的。最常见的一个限制是,在反序列化时,自定义类的定义必须在当前环境中可用。也就是说,如果你序列化了一个
MyClass
MyClass
AttributeError
ModuleNotFoundError
另外,有些Python对象是无法被pickle
pickle
pickle
对于这些无法直接序列化的对象,或者当你需要对序列化过程进行更精细的控制时,
pickle
__getstate__
__setstate__
__getstate__(self)
pickle
__dict__
__setstate__(self, state)
__getstate__
通过这两个方法,你可以自定义哪些数据需要被序列化,以及如何重建对象。例如,你可以选择不序列化一个文件句柄,而只保存其路径,然后在
__setstate__
import pickle
class MyResource:
def __init__(self, filename):
self.filename = filename
self.file_handle = open(filename, 'w') # 模拟一个不可序列化的资源
self.file_handle.write("Initial content\n")
def __getstate__(self):
# 返回一个可序列化的状态,这里只保存文件名
state = {'filename': self.filename}
return state
def __setstate__(self, state):
# 从状态中恢复对象,重新打开文件
self.filename = state['filename']
self.file_handle = open(self.filename, 'a') # 以追加模式重新打开
print(f"资源 {self.filename} 已重新打开。")
def write_data(self, data):
self.file_handle.write(data + '\n')
def close(self):
self.file_handle.close()
print(f"资源 {self.filename} 已关闭。")
# 创建并序列化对象
resource_obj = MyResource('temp_log.txt')
resource_obj.write_data("First line.")
resource_obj.close() # 序列化前关闭文件,避免问题
pickled_resource = pickle.dumps(resource_obj)
# 反序列化对象
unpickled_resource = pickle.loads(pickled_resource)
unpickled_resource.write_data("Second line after unpickling.")
unpickled_resource.close()
# 清理
import os
os.remove('temp_log.txt')这个例子展示了如何通过
__getstate__
__setstate__
pickle
pickle
pickle
pickle
JSON (JavaScript Object Notation):
msgpack:
何时选择pickle
我的经验是,
pickle
pickle
multiprocessing
pickle
pickle
pickle
总结一下,如果你的应用场景是纯Python环境,且数据来源绝对可信,同时你需要处理复杂且多样化的Python对象,那么
pickle
以上就是Python怎么序列化一个对象(pickle)_pickle模块对象序列化与反序列化的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号