在Python中,数据的持久化通常指的是将内存中的数据(如变量、列表、字典等)保存到硬盘上,以便在程序退出或重新启动后仍然可以访问这些数据。Python提供了多种实现数据持久化的模块,其中包括marshal和shelve。
一、marshal模块
marshal模块提供了一种将Python对象转换为字节序列(二进制字符串)的方式,以便可以将其保存到文件中。同时,它也可以将字节序列转换回Python对象。这个模块在处理简单的数据结构(如数字、字符串、列表和字典)时方便。
#1 将字典保存到文件中
import marshal
# 创建一个字典
data = {'name': '张三', 'age': 30, 'city': '西安'}
# 将字典写入文件
with open('data.marshal', 'wb') as f: marshal.dump(data, f)#2 从文件中读取字典到程序中
# 从文件读取数据
with open('data.marshal', 'rb') as f: loaded_data = marshal.load(f)
# 输出数据
print(loaded_data)
# 输出: {'name': '张三', 'age': 30, 'city': '西安'}
注意:marshal模块不支持跨平台的数据交换,因为它依赖于Python的内部表示。此外,由于它生成的是二进制数据,所以可读性也很差。
二、shelve模块
shelve模块提供了一个简单的持久化字典接口,使得Python对象可以像字典一样被保存到文件中,也可以从文件中读取到程序中。与marshal不同,shelve模块支持更复杂的Python对象,如自定义类的实例。
#1 将对象保存到文件中
import shelve
# 创建一个字典
data = {'name': '李四', 'age': 25, 'city': '上海'}
# 创建一个shelve数据库
with shelve.open('data.shelve') as db: db['person'] = data
#2 从文件中读取对象到程序中
# 打开shelve数据库
with shelve.open('data.shelve') as db: loaded_data = db['person']
# 输出数据
print(loaded_data)
# 输出: {'name': '李四', 'age': 25, 'city': '上海'}
注意事项:
虽然shelve模块非常方便,但它使用pickle来序列化对象,这可能会带来一些安全风险,因为pickle可以执行任意代码。因此,在处理不受信任的数据时,应该避免使用shelve模块。
当不再需要访问shelve数据库时,应该显式地关闭它(使用with语句可以自动关闭)。否则,可能会导致数据损坏或丢失。