shelve-对象持久存储

1.概念:

  • shelve模块使用一种类字典的API,可以持久存储可pickle的任意python对象。当不需要关系数据库的时候,shelve模块可以用作Python对象的的一个简单的持久存储选择,类似与字典,shelf要按键来访问,值将被pickle并写至anydbm创建和管理的数据库。
  • 什么是shelf?  类似与python内置类型字典(This is initialized with a dictionary-like object.),当创建了数据之后,如果再次访问数据,可以打开shelf,像字典一样使用。

2.小例子加深理解

  • 默认情况下,shelf不会跟踪可变对象的修改。

1 >>> import shelve  
2 
3 >>> s = shelve.open('test.dat')  
4 >>> s['x'] = ['a', 'b', 'c']  
5 >>> s['x'].append('d')  
6 >>> s['x']  
7 ['a', 'b', 'c']  

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

1 >>> temp = s['x']  
2 >>> temp.append('d')  
3 >>> s['x'] = temp  
4 >>> s['x']  
5 ['a', 'b', 'c', 'd']  

在python2.4中有了另外的方法,就是把open方法的writeback参数的值赋为True,这样的话,你open后所有的内容都将在cache中,当你close的时候,将全部一次性写到硬盘里面。如果数据量不是很大的时候,建议这么做。

  • 实例
 1 #!/usr/bin/python
 2 #-*- coding:utf-8 -*-
 3 #
 4 #shelve 模块用于永久存储对象
 5 import shelve
 6 class Person(object):
 7     def __init__(self,title,content):
 8         self.title = title
 9         self.content = content
10     def say(self):
11         print "您输入的标题是:%s\t 您输入的内容是:%s"%(self.title,self.content)
12 
13 tempPath = 'test.dat'
14 
15 def init():
16     m={}
17     f=shelve.open(tempPath,'w')
18     f["init"] = "-----欢迎您使用万能记事本-----"
19     f.close()
20 init()
21 
22 
23 print  '''请选择您的下一步:\n
24        (add) 添加永久保存的内容 \t
25        (del)删除永久的内容\t
26        (quit)关闭记事本\n
27        (show)展示永久保存的内容  '''
28 
29 
30 while True:
31     check = raw_input('请选择您下一步的操作:')
32     if check == 'quit':
33         break
34     if check == 'add':
35         print "-----欢迎您使用添加主题功能-----"
36         titleSave = raw_input('请输入您想永久保存的标题:')
37         contentSave = raw_input('请输入您想永久保存的内容:')
38         f = shelve.open(temPath,'w')
39         f['title'] = titleSave
40         f['content'] = contentSave
41         print '我添加的标题是:'+f["title"],'我添加的内容是:'+f["content"]
42 
43     if check == 'del':
44         print "-----欢迎您使用删除主题功能-----"
45         titleDel=raw_input('请输入您想删除标题的键值:')
46         f = shelve.open(tempPath,'w')
47         if f.has_key(titleDel):
48             del f[titleDel]
49         print "删除成功"
50 
51     if check == 'say':
52         titleSave=raw_input("请输入您想永久保存的标题:")
53         contentSave=raw_input("请输入您想永久保存的内容:")
54         person(raw_input(titleSave,contentSave))
55         person(raw_input(titleSave,contentSave)).say()
56         print "仔细看清楚呀,我没有保存哦"
57 
58     if check == 'show':
59         f = shelve.open(tempPath,'w')
60         print "-----下面是你永久保存的内容-----"
61         for key,value in f.iteritems():
62             print key,value
63         print "-----over-----"
64         f.close()
  • 创建一个新的shelf
1 import shelve
2 import contextlib
3 with contextlib.closing(shelve.open('test.db')) as s:
4      s['key1'] = {'int':10,'float':9.5,'string':'sample data'}
5 
6 #使用with statement,自动关掉打开的数据库
7 #contextlib.closing(thing)
8 #Return a context manager that closes thing upon completion of #the block. 
9 #http://docs.python.org/2/library/contextlib.html

 

 

posted on 2013-05-14 11:41  micky.zhou  阅读(323)  评论(0编辑  收藏  举报

导航