标签:
shelve
若只需要一个简单的存储方案,那么shelve模块可以满足你大部分的需要,你所需要的只是为它提供文件名。shelve中唯一有趣的函数是open,在调用的时候他会返回一个Shelf对象
注意:
只需要把它当作普通字典(但是键一定要是字符串)来操作
在操作完之后,调用它的close方法
在python2.4之后的版本还有一个解决方案,将open函数的writeback参数设为True。这样所有从shelf读取或者赋值到shelf的数据结构都会保存在内存(缓存)中,而且只有在关闭shelf的时候才会回写到硬盘。
open函数参数说明
这个主要是解决这个问题:
1 import shelve 2 s = shelve.open(‘data.dat‘,‘c‘,None,False) 3 s[‘x‘] = [‘a‘,‘b‘,‘c‘] 4 s[‘x‘].append(‘d‘) 5 print (s[‘x‘])
会发现 s[‘x‘]还是‘a‘,‘b‘,‘c‘ 这是因为在s[‘x‘].append(‘d‘) 有一个创建副本的过程,即先会提取s[‘x‘] 的内容建立一个副本,然后会在这个副本上追加‘d‘,但此时的变更不会同步在s[‘x‘]中。
所以解决办法阔以这样
1 import shelve 2 s = shelve.open(‘data.dat‘,‘c‘,None,False) 3 s[‘x‘] = [‘a‘,‘b‘,‘c‘] 4 temp = s[‘x‘] ! 5 temp.append(‘d‘) ! 6 s[‘x‘] = temp ! 7 print (s[‘x‘])
这段的亮点主要在s[‘x‘] = temp 等同于一个回写的操作,这样就把变更后的数据写入了s[‘x‘]
示例
最后在后面有一个个人信息录入/查看程序
增加了在添加信息时测试是否重复的过程
1 import sys,shelve 2 #储存信息 3 def store_person(db): 4 while (True): 5 pid = input(‘Enter unique ID number : ‘) 6 if pid in db.keys(): 7 print (‘find the same key : ‘) 8 else: 9 break 10 11 person = {} 12 person [‘name‘] = input(‘Enter name : ‘) 13 person [‘age‘] = input(‘Enter age : ‘) 14 person [‘phone‘] = input(‘Enter phone number : ‘) 15 16 db[pid] = person 17 print (‘add to db done!‘) 18 #查找信息 19 def lookup_person(db): 20 pid = input(‘Enter ID number : ‘) 21 field = input(‘What would you like to know?(name,age,phone,all) : ‘) 22 field = field.strip().lower() 23 if field == ‘all‘: 24 d = db[pid] 25 for key,value in d.items(): 26 print (key,‘:‘,value) 27 else: 28 print (field.capitalize() + ‘:‘,db[pid][field]) 29 #。。。 30 def print_help(): 31 print (‘help something‘) 32 33 #获取用户输入 34 def enter_command(): 35 cmd = input(‘Enter command(? for help) : ‘) 36 cmd = cmd.strip().lower() 37 return cmd 38 39 def main(): 40 database = shelve.open(‘date.dat‘) 41 try: 42 while True: 43 cmd = enter_command() 44 if cmd == ‘s‘: 45 store_person(database) 46 elif cmd == ‘l‘: 47 lookup_person(database) 48 elif cmd == ‘?‘: 49 print_help() 50 elif cmd == ‘q‘: 51 break; 52 finally: 53 database.close() 54 print (‘stop by user‘) 55 56 if __name__ == ‘__main__‘ : main()
标签:
原文地址:http://www.cnblogs.com/leihui/p/5568637.html