Python简要标准库(3)

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()

 

posted on 2016-06-07 23:04  leihui  阅读(237)  评论(0编辑  收藏  举报