zoukankan      html  css  js  c++  java
  • day5模块学习--shelve模块

    shelve模块

        shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使用者可以将一个列表、字典、或者用户自定义的类实例保存到shelve中,下次需要用的时候直接取出来,就是一个Python内存对象,不需要像传统数据库一样,先取出数据,然后用这些数据重新构造一遍所需要的对象。下面是简单示例:

        shelve存储数据:

        import shelve,datetime

      names = ["alex","tom","tenglan"]
      ages = [18,16,15]
      f = shelve.open("database")
      f["age"] = ages
      f["name"] = names
      f['date'] = datetime.date.today()
      f.close()
        上面代码中,我们使用shelve打开文件并往里面写入数据,是以字典形式写入数据,句柄f相当于字典一样,往文件添加数据,就跟我们往字典中添加数据的原理是一样的,如f["age"]=ages,键值对。

        shelve读取数据:

    import shelve,datetime
    
    f = shelve.open("database")
    print(f.keys())
    print(f.values())
    print(type(f.get("name")))
    print(f.get("age"))
    print(f.get("date"))
    f.close()
    运行如下:
    KeysView(<shelve.DbfilenameShelf object at 0x7f0e89a97898>)
    ValuesView(<shelve.DbfilenameShelf object at 0x7f0e89a97898>)
    <class 'list'>
    [18, 16, 15]
    2017-07-23

        上面代码,我们把存储的数据对去出来了,可以看出,读取出来的数据类型没有改变,不是字符串,并且文件句柄就是一个字典,存储在文件句柄中一样。

        shelve模块打开文件还有一个神奇的地方,就是如果这个文件不存在则创建,如果这个文件存在则读取。

        这个有一个潜在的小问题,如下:

        >>> import shelve
      >>> s = shelve.open("test.dat")
      >>> s["x"] = ["a","b","c"]
      >>> s["x"].append("d")
      >>> s["x"]
      ['a', 'b', 'c']

        存储的d到哪里去了呢?其实很简单,d没有写入,我们把["a","b","c"]存储到了x,当我们再次读取s["x"]的时候,s["x"]只是一个拷贝,而我们没有将拷贝写回,所以当我们再次读取s["x"]的时候,它又从源中读取了一个拷贝,所以,我们新修改的内容并不会出现在拷贝中,解决的办法就是,第一个是利用一个缓存的变量,如下所示:     >>> import shelve

        >>> s = shelve.open("test.dat")
      >>> tmp = ["a","b","c"]
      >>> s["x"] = tmp
      >>> tmp.append("d")
      >>> s["x"] = tmp
      >>> s['x']
      ['a', 'b', 'c', 'd']
      s.close()

        文件写进去时候是不能直接修改的,就算修改了,也要重新写进去,这就是文件的要求,不可能修改之后,文件里面直接改变。

    import shelve,datetime

    f = shelve.open("database")
    print(f.keys())
    print(f.values())
    print(type(f.get("name")))
    print(f.get("age"))
    print(f.get("date"))
    f.close()
  • 相关阅读:
    Android 入门到精通 (Index)
    负载平衡与冗余备份方案概述
    Android 程序组件交互分析
    复制时保留文件的目录结构
    notepad++中设置tab缩进的宽度
    scws
    php 将字符(包括汉字) 转换成16进制 (apache access log 中文显示16进制码)
    批量修改完整版本
    根据端口号查进程
    php性能优化
  • 原文地址:https://www.cnblogs.com/gengcx/p/7224278.html
Copyright © 2011-2022 走看看