概念:不需要关系数据库时,可以用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