zoukankan      html  css  js  c++  java
  • shelve模块(超级好用~!)

    '''
        python中的shelve模块,可以提供一些简单的数据操作
        他和python中的dbm很相似。
    
        区别如下:
        都是以键值对的形式保存数据,不过在shelve模块中,
        key必须为字符串,而值可以是python所支持的数据
        类型。在dbm模块中,键值对都必须为字符串类型。
    
        sh['a'] = 'a'
        sh['c'] = [11, 234, 'a']
        sh['t'] = ('1', '2', '3')
        sh['d'] = {'a':'2', 'name':'Hongte' }
        sh['b'] = 'b'
        sh['i'] = 23
    
        我们可以获取一个shelve对象
        sh = shelve.open('c:\test\hongten.dat', 'c')
    
        删除shelve对象中的某个键值对
        del sh['d']
    
        遍历所有数据
        for item in sh.items():
            print('键[{}] = 值[{}]'.format(item[0], sh[item[0]]))
    
        获取某个键值对
        print(sh['a'])
    
        关闭shelve对象:
        sh.close()
        
        ####################################################
        ####        API中强调
        Do not rely on the shelf being closed automatically;
        always call close() explicitly when you don’t need
        it any more, or use a with statement with
        contextlib.closing().
        ####################################################
    
    '''

    下面是我做的demo,在demo中我做了比较详细的注释和说明,详情如下:

    运行效果:

    SHOW_LOG = False

    Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> ================================ RESTART ================================
    >>> 
    SHOW_LOG : False
    删除所有数据...
    保存数据...
    ##################################################
    遍历所有数据...
    数据[gender] = [M]
    数据[phone] = [('13423****62', '18998****62')]
    数据[age] = [22]
    数据[name] = [Hongten]
    数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    ##################################################
    更新数据...
    ##################################################
    遍历所有数据...
    数据[gender] = [M]
    数据[phone] = [('13423****62', '18998****62', '020-90909090')]
    数据[name] = [Hongten]
    数据[hoby] = [('篮球', '羽毛球', '乒乓球', '游泳')]
    数据[age] = [23]
    数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    ##################################################
    获取某个数据...
    获取[address]的值:{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}
    ##################################################
    删除某个数据...
    ##################################################
    遍历所有数据...
    数据[gender] = [M]
    数据[phone] = [('13423****62', '18998****62', '020-90909090')]
    数据[age] = [23]
    数据[name] = [Hongten]
    数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    ##################################################
    删除所有数据...
    ##################################################
    遍历所有数据...
    >>>

     SHOW_LOG = True

    Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32
    Type "copyright", "credits" or "license()" for more information.
    >>> ================================ RESTART ================================
    >>> 
    SHOW_LOG : True
    删除所有数据...
    保存数据...
    保存数据[age] = [22]
    保存数据[gender] = [M]
    保存数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    保存数据[phone] = [('13423****62', '18998****62')]
    保存数据[name] = [Hongten]
    ##################################################
    遍历所有数据...
    数据[age] = [22]
    数据[name] = [Hongten]
    数据[gender] = [M]
    数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    数据[phone] = [('13423****62', '18998****62')]
    ##################################################
    更新数据...
    更新数据[name] = [Hongten]
    更新数据[hoby] = [('篮球', '羽毛球', '乒乓球', '游泳')]
    更新数据[phone] = [('13423****62', '18998****62', '020-90909090')]
    更新数据[age] = [23]
    ##################################################
    遍历所有数据...
    数据[age] = [23]
    数据[gender] = [M]
    数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    数据[hoby] = [('篮球', '羽毛球', '乒乓球', '游泳')]
    数据[phone] = [('13423****62', '18998****62', '020-90909090')]
    数据[name] = [Hongten]
    ##################################################
    获取某个数据...
    获取[address]的值:{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}
    ##################################################
    删除某个数据...
    删除[hoby]的数据
    ##################################################
    遍历所有数据...
    数据[age] = [23]
    数据[name] = [Hongten]
    数据[gender] = [M]
    数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    数据[phone] = [('13423****62', '18998****62', '020-90909090')]
    ##################################################
    删除所有数据...
    删除数据[age] = [23]
    删除数据[gender] = [M]
    删除数据[address] = [{'hometown': 'Shuifu,Yunnan', 'nowadd': 'Guangzhou,Guangdong'}]
    删除数据[phone] = [('13423****62', '18998****62', '020-90909090')]
    删除数据[name] = [Hongten]
    ##################################################
    遍历所有数据...
    >>>

    =====================================================

    代码部分:

    =====================================================

    #python shelve
    
    #Author : Hongten
    #MailTo : hongtenzone@foxmail.com
    #QQ     : 648719819
    #Blog   : http://www.cnblogs.com/hongten
    #Create : 2013-08-09
    #Version: 1.0
    
    import shelve
    '''
        python中的shelve模块,可以提供一些简单的数据操作
        他和python中的dbm很相似。
    
        区别如下:
        都是以键值对的形式保存数据,不过在shelve模块中,
        key必须为字符串,而值可以是python所支持的数据
        类型。在dbm模块中,键值对都必须为字符串类型。
    
        sh['a'] = 'a'
        sh['c'] = [11, 234, 'a']
        sh['t'] = ('1', '2', '3')
        sh['d'] = {'a':'2', 'name':'Hongte' }
        sh['b'] = 'b'
        sh['i'] = 23
    
        我们可以获取一个shelve对象
        sh = shelve.open('c:\test\hongten.dat', 'c')
    
        删除shelve对象中的某个键值对
        del sh['d']
    
        遍历所有数据
        for item in sh.items():
            print('键[{}] = 值[{}]'.format(item[0], sh[item[0]]))
    
        获取某个键值对
        print(sh['a'])
    
        关闭shelve对象:
        sh.close()
        
        ####################################################
        ####        API中强调
        Do not rely on the shelf being closed automatically;
        always call close() explicitly when you don’t need
        it any more, or use a with statement with
        contextlib.closing().
        ####################################################
    
    '''
    #global var
    #是否显示日志信息
    SHOW_LOG = True
    
    def get_shelve():
        '''open -- file may get suffix added by low-level library'''
        return shelve.open('c:\test\hongten.dat', 'c')
    
    def save(sh):
        '''保存数据'''
        if sh is not None:
            sh['name'] = 'Hongten'
            sh['gender'] = 'M'
            sh['address'] = {'hometown' : 'Shuifu,Yunnan', 'nowadd' : 'Guangzhou,Guangdong'}
            sh['phone'] = ('13423****62', '18998****62')
            sh['age'] = 22
            if SHOW_LOG:
                for item in sh.items():
                    print('保存数据[{}] = [{}]'.format(item[0], sh[item[0]]))
            sh.close()
        else:
            print('the shelve object is None!')
    
    def update(sh):
        '''更新数据'''
        if sh is not None:
            sh['name'] = 'Hongten'
            sh['hoby'] = ('篮球', '羽毛球', '乒乓球', '游泳')
            sh['phone'] = ('13423****62', '18998****62', '020-90909090')
            sh['age'] = 23
            if SHOW_LOG:
                keys = ('name', 'hoby', 'phone', 'age')
                for item in keys:
                    print('更新数据[{}] = [{}]'.format(item, sh[item]))
            sh.close()
        else:
            print('the shelve object is None!')
    
    def delete(sh, key):
        '''删除某个数据'''
        if sh is not None:
            if SHOW_LOG:
                print('删除[{}]的数据'.format(key))
            del sh[key]
            sh.close()
        else:
            print('the shelve object is None!')
    
    def deleteall(sh):
        '''删除所有数据'''
        if sh is not None:
            for item in sh.items():
                if SHOW_LOG:
                    print('删除数据[{}] = [{}]'.format(item[0], sh[item[0]]))
                del sh[item[0]]
            sh.close()
        else:
            print('the shelve object is None!')
    
    def fetchone(sh, key):
        '''获取某个数据'''
        if sh is not None:
            print('获取[{}]的值:{}'.format(key, sh[key]))
            sh.close()
        else:
            print('the shelve object is None!')
    
    def fetchall(sh):
        '''遍历所有数据'''
        if sh is not None:
            for item in sh.items():
                print('数据[{}] = [{}]'.format(item[0], sh[item[0]]))
            sh.close()
        else:
            print('the shelve object is None!')
    
    ###############################################################
    ###                测试           START
    ###############################################################
    def save_test():
        '''保存数据...'''
        print('保存数据...')
        sh = get_shelve()
        save(sh)
    
    def fetchall_test():
        '''遍历所有数据'''
        print('遍历所有数据...')
        sh = get_shelve()
        fetchall(sh)
    
    def fetchone_test():
        '''获取某个数据'''
        print('获取某个数据...')
        sh = get_shelve()
        key = 'address'
        fetchone(sh, key)
    
    def delete_test():
        '''删除某个数据'''
        print('删除某个数据...')
        sh = get_shelve()
        key = 'hoby'
        delete(sh, key)
    
    def update_test():
        '''更新数据...'''
        print('更新数据...')
        sh = get_shelve()
        update(sh)
    
    def deleteall_test():
        '''删除所有数据'''
        print('删除所有数据...')
        sh = get_shelve()
        deleteall(sh)
        
    ###############################################################
    ###                测试           END
    ###############################################################
    
    def init():
        global SHOW_LOG
        SHOW_LOG = True
        print('SHOW_LOG : {}'.format(SHOW_LOG))
        deleteall_test()
        save_test()
    
    def main():
        init()
        print('#' * 50)
        fetchall_test()
        print('#' * 50)
        update_test()
        print('#' * 50)
        fetchall_test()
        print('#' * 50)
        fetchone_test()
        print('#' * 50)
        delete_test()
        print('#' * 50)
        fetchall_test()
        print('#' * 50)
        deleteall_test()
        print('#' * 50)
        fetchall_test()
        
    if __name__ == '__main__':
        main()
  • 相关阅读:
    【dp专题1】hdu1003 D
    #网络之宙斯盾航母#-----占位--------linux
    面向过程6-----#过程之王#----占个位-----汇编语言----(面向机器)
    面向过程5----c#
    高级语言学习总结
    js实现求二元一次方程的根
    小知识点总结
    js小案例,判断年龄是否成年
    js实现结婚吧小案例
    面向过程4-----perl
  • 原文地址:https://www.cnblogs.com/itfat/p/7622793.html
Copyright © 2011-2022 走看看