Python中的pickle模块可以将Python对象序列化为二进制流,并在需要时反序列化回原始对象。pickle模块广泛应用于 Python 中可用于本地存储或远程传输数据对象。本文将详细介绍Python pickle模块的使用。
序列化数据
在Python中,要使用pickle模块对对象进行序列化,需要导入pickle模块。标准的pickle模块提供了四个方法:dumps, dump,loads 和 load,用于序列化和反序列化 Python 对象。
对象序列化
dumps() 方法将 Python 对象序列化为二进制格式的字符串。以下示例展示了如何使用 "dumps" 将 Python 数据序列化为二进制流:
import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
serialized_data = pickle.dumps(data)
print(serialized_data)
输出结果如下,这是二进制的数据:
b'\x80\x04\x95!\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05Alice\x94\x8c\x03age\x94K\x1f\x8c\x04city\x94\x8c\x08New York\x94u.'
文件序列化
pickle 还提供了"dump"方法将序列化后的数据写入文件中,使用以下代码:
import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
filename = 'data.pkl'
with open(filename, 'wb') as f:
pickle.dump(data, f)
对象反序列化
loads() 方法将二进制格式的字符串反序列化回原始 Python 对象。以下示例展示了如何将 "dumps" 输出的二进制二进制数据还原为 Python 对象:
import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
serialized_data = pickle.dumps(data)
deserialized_data = pickle.loads(serialized_data)
print(deserialized_data)
输出结果如下:
{'name': 'Alice', 'age': 31, 'city': 'New York'}
文件反序列化
load() 方法从文件中读取序列化后的数据,并将其转换为 Python 对象。使用以下代码:
import pickle
filename = 'data.pkl'
with open(filename, 'rb') as f:
data = pickle.load(f)
print(data)
在反序列化时需要注意,该对象的类必须存在于程序的命名空间中,否则将抛出 ClassNotFoundException。
常见问题
pickle 安全问题
pickle 的默认行为可能会导致安全问题。由于 pickle 可以从任何可读数据的字符串中反序列化 Python 对象,因此攻击者可以通过包含恶意代码的消息或数据对 pickle 反序列化进行攻击。为了缓解此风险,pickle 模块提供了另外一种更安全的方法。
import pickle
data = {'name': 'Alice', 'age': 31, 'city': 'New York'}
serialized_data = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
print(serialized_data)
HIGHEST_PROTOCOL 会选择最高有效协议版本,该版本更安全。
pickle 兼容性
pickle 格式不同版本之间不能兼容。反序列化时,我们需要确保序列化和 反序列化使用相同的pickle版本。否则可能会出现UnpicklingError。
为了解决这个问题,Python3.0 提供了新模块 "pickle" (在 python 中增加了一个基于新 pickle 协议的叫做"pickle"),可以兼容Python 2.4 及以下版本的格式,同时也支持 Python 3.0 以上的版本。通过以下代码可以导入新模块:
import pickle5 as pickle
在 Python 3.0 以上版本中,该模块可用。在 Python 2.x 版本中需要安装 pickle5 库。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python pickle模块实现对象序列化 - Python技术站