Python中pickle模块浅析
简介
pickle
是Python中常用的用于序列化和反序列化数据的模块,能够将Python对象转换成二进制流以便于储存和传输。pickle
模块主要的两个函数是dump()
和load()
。dump()
函数将Python对象序列化为二进制数据并存储,而load()
函数则从二进制数据文件中读取并反序列化Python对象。
使用方法
序列化
首先,我们需要导入pickle
模块。然后,我们可以通过dump()
函数将一个Python对象序列化为二进制流并储存到一个文件中。示例代码如下:
import pickle
# 要序列化的Python对象
data = {
'name': 'Jack',
'age': 20,
'interests': ['reading', 'music', 'movies'],
}
# 序列化并储存
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)
print('序列化完成!')
在这个示例中,我们将一个Python对象data
序列化并储存到一个名为data.pickle
的文件中。使用with
语句能够保证文件在储存完毕后自动关闭。
反序列化
我们可以使用load()
函数来从某个二进制数据文件中读取并反序列化Python对象。示例代码如下:
import pickle
# 读取并反序列化
with open('data.pickle', 'rb') as f:
data = pickle.load(f)
# 输出反序列化得到的Python对象
print(data)
在这个示例中,我们读取了名为data.pickle
的文件并使用load()
函数反序列化其中的二进制数据,最后将反序列化得到的Python对象打印输出。
注意事项
需要注意的是,pickle
模块序列化的数据是二进制数据,无法被人类直接阅读和理解。另外,由于pickle
模块可以执行任意Python代码,所以反序列化前需要确保二进制数据文件的合法性,避免安全问题。因此,尽量避免将未知来源的二进制数据文件反序列化。
示例说明
以下是两个使用pickle
模块的示例说明。
示例1:储存和读取一个复杂的Python对象
假设我们有一个较为复杂的Python对象,其中嵌套了多个字典和列表。我们可以使用pickle
模块将其序列化并储存到一个文件中,之后再通过load()
函数读取并反序列化得到Python对象。示例代码如下:
import pickle
# 要序列化的Python对象
data = {
'name': 'Jack',
'age': 20,
'interests': ['reading', 'music', 'movies'],
'grades': {
'math': 90,
'python': 80,
'english': 95,
},
'friends': [
{'name': 'Tom', 'age': 21},
{'name': 'Lucy', 'age': 19},
],
}
# 序列化并储存
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)
# 读取并反序列化
with open('data.pickle', 'rb') as f:
loaded_data = pickle.load(f)
print(loaded_data)
示例2:将Python对象序列化字符串传输
我们可以将一个Python对象序列化为一个字符串,以便于传输和储存。在接收端,我们再将这个字符串反序列化为Python对象。示例代码如下:
import pickle
# 要序列化的Python对象
data = {
'name': 'Jack',
'age': 20,
'interests': ['reading', 'music', 'movies'],
}
# 序列化为字符串
serialized_data = pickle.dumps(data)
# 将字符串反序列化为Python对象
loaded_data = pickle.loads(serialized_data)
print(loaded_data)
在这个示例中,我们将Python对象data
序列化为字符串serialized_data
,然后通过pickle.loads()
函数将其反序列化为Python对象loaded_data
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中pickle模块浅析 - Python技术站