zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    系统综合实践_5
    系统综合实践_4
    系统综合实践_3
    系统综合实践_2
    系统综合实践_1
    软件工程17—第09组 Beta版本演示
    软件工程16—第09组 Beta冲刺(4/4)
    软工实践个人总结
    第06组 Beta版本演示
    第06组 Beta冲刺(5/5)
  • 原文地址:https://www.cnblogs.com/leihui/p/5568637.html
Copyright © 2011-2022 走看看