作者:Era_zhou | 来源:互联网 | 2024-12-08 16:19
当项目需要一个简单且高效的存储方案时,Python的shelve模块是一个不错的选择。本文将详细介绍如何利用shelve模块进行基本的数据持久化操作,包括如何打开数据库、进行数据的增删查改等。
shelve模块提供了类似字典的接口,用于存储任意Python对象。使用shelve模块时,仅需提供一个文件名即可开始存储数据。该模块最核心的功能是通过open
函数创建或打开一个shelve数据库,返回一个Shelf对象。
注意事项:
- 可以像操作普通字典一样对Shelf对象进行操作,但需要注意的是,所有的键必须是字符串类型。
- 完成所有操作后,务必调用
close
方法来确保数据被正确地写入磁盘并释放资源。
从Python 2.4版本起,open
函数新增了一个writeback
参数,设置为True
时,所有从shelf读取或赋值给shelf的数据结构都将保存在内存中(即缓存),并在shelf关闭时一次性写回到磁盘,这有助于减少频繁的磁盘I/O操作。
参数说明:
shelve.open(filename, flag='c', protocol=None, writeback=False)
,其中filename
为文件名,flag
定义文件的打开模式,默认为'c',表示如果文件不存在则创建;protocol
指定pickle协议版本;writeback
控制是否启用缓存机制。
常见问题及解决方法:
在使用shelve进行列表操作时,如直接对列表元素进行修改,可能会遇到数据未更新的问题。这是因为shelve在进行列表操作时,默认情况下会创建一个副本进行修改,而不会立即更新原始数据。正确的做法是在修改后显式地将更改后的数据重新赋值给对应的键,例如:
import shelve
db = shelve.open('data.dat')
db['x'] = ['a', 'b', 'c']
temp = db['x']
temp.append('d')
db['x'] = temp
print(db['x']) # 输出: ['a', 'b', 'c', 'd']
示例应用:
下面是一个简单的个人信息管理系统,支持信息的录入和查询功能,并在添加信息时检查是否存在重复的ID号:
import sys, shelve
def store_person(db):
while True:
pid = input('请输入唯一的ID号: ')
if pid in db:
print('已存在相同的ID号')
else:
break
person = {}
person['name'] = input('请输入姓名: ')
person['age'] = input('请输入年龄: ')
person['phone'] = input('请输入电话号码: ')
db[pid] = person
print('信息添加成功!')
def lookup_person(db):
pid = input('请输入ID号: ')
field = input('您想了解什么信息?(name, age, phone, all): ').strip().lower()
if field == 'all':
for key, value in db[pid].items():
print(key, ':', value)
else:
print(field.capitalize(), ':', db[pid][field])
def print_help():
print('帮助信息')
def enter_command():
cmd = input('请输入命令(? 查看帮助): ').strip().lower()
return cmd
def main():
database = shelve.open('date.dat')
try:
while True:
cmd = enter_command()
if cmd == 's':
store_person(database)
elif cmd == 'l':
lookup_person(database)
elif cmd == '?':
print_help()
elif cmd == 'q':
break
finally:
database.close()
print('程序已终止')
if __name__ == '__main__':
main()