下午不想写代码了,写个shelve的模块使用(简单实用的小型数据库)。

概念:不需要关系数据库时,可以用shelve模块作为持久存储Python对象的一个简单的选择。类似与字典,shelf按键访问,值将被腌制并写至由dbm创建和管理的数据库

我的理解,Python操作的时候像字典,类型感觉跟MongoDB比较像。

 

进过实际测试,

import shelve

class A:
    pass

a = A()
a.name = 'sidian'

# 通过shelve.open打开一个文件,创建一个对象
s = shelve.open('test.dat',writeback=False)
# print(dir(s))
'''
['_MutableMapping__marker', '__abstractmethods__', '__class__', '__contains__', '__del__', '__delattr__', 
'__delitem__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', 
'__exit__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', 
'__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
 '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', 
 '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', 
 '_abc_impl', '_protocol', 'cache', 'clear', 'close', 'dict', 'get', 'items',
  'keyencoding', 'keys', 'pop', 'popitem', 'setdefault', 'sync', 'update', 
  'values', 'writeback']
'''
# 从上面可以看到,基本的方法还是比较全的跟字典基本差不多

# print(s['x'])
# print(s['a'].age)
s['a'] = a
s['x'] = ['a', 'b', 'c']
print(s['x'])
# 假如我像更新s['x']默认要这么操作
s_temp = s['x']
s_temp.append('d')
s['x'] = s_temp

print(s['x'])
s.close()

'''
默认的,打开的shelf不会跟踪对可变对象的修改。,所以当一个shelf中的一个元素的内容发生变化,
必须通过重新赋值的方式来显式更新

也可以通过将writeback设置为True,那样shelf使用内存中的缓存以记住从数据库获取的所有对象。
shelf关闭时每个缓存对象也被写回到数据库。

尽管这会减少程序员犯错的机会,并且使对象持久存储更透明,但是并非所有的情况都有必要使用写回模式。
打开shelf时缓存会消耗额外的内存,关闭shelf时会暂停将各个缓存对象写回到数据库,这会减慢应用的速度。
所有缓存的对象都要写回数据库,因为无法区分它们是否修改。如果应用读取的数据多余写的数据,那么写回就会
影响性能而没有太大的意义
'''

 

['a', 'b', 'c']
['a', 'b', 'c', 'd']

 参数里面还有一个flag,可以标记只读,读写等模式,默认是读写的。

 

还是非常简单实用的小模块。

 

参考的国内链接:

https://www.cnblogs.com/sui776265233/p/9225164.html

https://blog.csdn.net/u012145252/article/details/80028146

https://www.jianshu.com/p/e6f0fbc2eabe

posted @ 2019-11-20 16:56  就是想学习  阅读(228)  评论(0编辑  收藏  举报