对键,我们使用DVD的标题python3函数编写;对值 , 则使用元组 , 其中存放发行者、发行年份以及时间 。借助于shelve模块 , 我们不需要进行任何数据转换,并可以把DBM对象当做一个字典进行处理 。
程序在结构上类似于我们前面看到的那种菜单驱动型的程序,因此,这里主要展示的是与DBM程序设计相关的那部分 。下面给出的是程序main()函数中的一部分, 忽略了其中菜单处理的部分代码 。
db = None
try:
db = shelve.open(filename, protocol=pickle.HIGHEST_PROTOCOL)
finally:
if db is not None:
db.dose()
这里我们已打开(如果不存在就创建)指定的DBM文件,以便于对其进行读写操作 。每一项的值使用指定的pickle协议保存为一个pickle,现有的项可以被读取,即便是使用更底层的协议保存的,因为Python可以计算出用于读取pickle的正确协议 。最后 , DBM被关闭——其作用是清除DBM的内部缓存,并确保磁盘文件可以反映出已作的任何改变 , 此外,文件也需要关闭 。
该程序提供了用于添加、编辑、列出、移除、导入、导出DVD数据的相应选项 。除添加外,我们将忽略大部分用户接口代码,同样是因为已经在其他上下文中进行了展示 。
def add_dvd(db):
title = Console.get_string("Title", "title")
if not title:
return
director = Console.get_string("Director", "director")
if not director:
return
year = Console.get_integer("Year", "year",minimum=1896,
maximum=datetime,date.today().year)
duration = Console.get_integer("Duration (minutes)", "minutes“, minimum=0, maximum=60*48)
db[title] = (director, year, duration)
db.sync()
像程序菜单调用的所有函数一样,这一函数也以DBM对象(db)作为其唯一参数 。该函数的大部分工作都是获取DVD的详细资料,在倒数第二行 , 我们将键-值项存储在DBM文件中,DVD的标题作为键 , 发行者、年份以及时间(由shelve模块pickled在一起)作为值 。
为与Python通常的一致性同步,DBM提供了与字典一样的API,因此,除了 shelve.open() 函数(前面已展示)与shelve.Shelf.sync()方法(该方法用于清除shelve的内部缓存,并对磁盘上文件的数据与所做的改变进行同步——这里就是添加一个新项),我们不需要学习任何新语法 。
def edit_dvd(db):
old_title = find_dvd(db, "edit")
if old_title is None:
return
title = Console.get.string("Title", "title", old_title)
if not title:
return
director, year, duration = db[old_title]
...
db[title]= (director, year, duration)
if title != old_title:
del db[old_title]
db.sync()
为对某个DVD进行编辑,用户必须首先选择要操作的DVD,也就是获取DVD 的标题 , 因为标题用作键,值则用于存放其他相关数据 。由于必要的功能在其他场合 (比如移除DVD)也需要使用,因此我们将其实现在一个单独的find_dvd()函数中,稍后将査看该函数 。如果找到了该DVD,我们就获取用户所做的改变,并使用现有值作为默认值,以便提高交互的速度 。(对于这一函数,我们忽略了大部分用户接口代码, 因为其与添加DVD时几乎是相同的 。)最后 , 我们保存数据,就像添加时所做的一样 。如果标题未作改变,就重写相关联的值;如果标题已改变,就创建一个新的键-值对,并且需要删除原始项 。
def find_dvd(db, message):
message = "(Start of) title to " + message
while True:
matches =[]
start = Console.get_string(message, "title")
if not start:
return None
for title in db:
if title.lower().startswith(start.lower()):
推荐阅读
- 鸿蒙os2.2测评,鸿蒙os23
- jdbc连接oracle写法,jdbc连接oracle代码
- 网络游戏刷金币赚钱,网络游戏刷金币赚钱软件
- 直播为什么那么费电量,看直播为什么费电
- htm如果获取php数据 html如何获取php中的变量
- 如何给mysql备份吗,Mysql实时异地备份
- 武汉网站开发智力,武汉网站建设有哪些
- 如何把几张pdf拼到一张,怎么把几张pdf放到一起
- 包含徐州容易上手家纺erp系统的词条