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()
  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/gengcx/p/7224278.html
Copyright © 2011-2022 走看看