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'>
[, , ]
--

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

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

day5模块学习--shelve模块的更多相关文章

  1. logging模块、sys模块、shelve模块

    一.logging模块 1.logging模块就是用于记录日志的,日志就是记录某个时间点,发生的事情. 2.记录日志是为了日后来复查,提取有用的信息. 3.如何去记录日志:可以直接打开文件,记录信息, ...

  2. python常用模块之shelve模块

    python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...

  3. day5模块学习 -- os模块学习

    python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/ ...

  4. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  5. 序列化模块— json模块,pickle模块,shelve模块

    json模块 pickle模块 shelve模块 序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. # 序列化模块 # 数据类型转化成字符串的过程就是序列化 # 为了方便存储和网 ...

  6. Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块

    一.sys模块 1.sys.argv 命令行参数List,第一个元素是程序本身路径 2.sys.exit(n) 退出程序,正常退出时exit(0) 3.sys.version . sys.maxint ...

  7. python16_day06【类、RE模块、subprocess模块、xml模块、shelve模块】

    一.shelve模块 import shelve # 基于pickle模块, d = shelve.open('shelve_test') class Test(object): def __init ...

  8. Python基础(12)_python模块之sys模块、logging模块、序列化json模块、pickle模块、shelve模块

    5.sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 ...

  9. python 之 random 模块、 shutil 模块、shelve模块、 xml模块

    6.12 random 模块 print(random.random()) (0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) [1,3] 大 ...

随机推荐

  1. 《剑指offer》面试题39 二叉树的深度(java)

    摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...

  2. [USACO5.3]量取牛奶Milk Measuring

    https://daniu.luogu.org/problemnew/show/P2744 滚动数组压去第一维:前i种木桶 f[j] 量取体积j最少需要几种木桶 g[j]  体积j的最优解是否使用了第 ...

  3. ELASTIC SEARCH 安装

    elastic search 2017年3月18日 安装&使用 环境 表 1 环境信息 Centos cat /etc/issue CentOS release 6.8 (Final) cat ...

  4. JavaScript语法对{}的奇葩处理

    JavaScript的语法有多坑,算是众人皆知了. 今天看到vczh的这条微博:http://weibo.com/1916825084/B7qUFpOKb , 代码如下: {} + []; [] + ...

  5. TED_Topic5:How virtual reality can create the ultimate empathy machine

    By Chris Milk # Background about our speaker Working at the frontiers of interactive technology, Chr ...

  6. 在Emacs中画思维导图

    是的,你没有看错.其实,不只画思维导图,画结构图.流程图等,都可以.那怎么办呢?就是借助 Graphviz . Graphviz 可以方便地表达概念之间的联系,因此用它画思维导图是可行的,再加上它是个 ...

  7. petri网初步

    历史:Petri网的概念是德国的Carl Adam Petri早在1962年提出来的.他在他的论文里提出了一个新的信息流模型,这个模型基于系统各部分的异步并发的操作,并把各部分之间的关系用网状的图来描 ...

  8. thinkphp 修改分页样式表

    原网页:http://blog.csdn.net/u014175572/article/details/53116546 在这里我有先把page的设置做成了一个函数getpage, 将这个方法放到Ap ...

  9. addclass,removeclass

    定义和用法 addClass() 方法向被选元素添加一个或多个类. 该方法不会移除已存在的 class 属性,仅仅添加一个或多个 class 属性. 提示:如需添加多个类,请使用空格分隔类名. rem ...

  10. HDU 2063 过山车 二分匹配

    解题报告:有m个女生和n个男生要结成伴坐过山车,每个女生都有几个自己想选择的男生,然后要你确定最多能组成多少对组合. 最裸的一个二分匹配,这是我第一次写二分匹配,给我最大的感受就是看那些人讲的匈牙利算 ...