目的:Shelve模块为任意能够pickle的Python对象实现持久化存储,并提供一个类似字典的接口。

在关系型数据库还过于复杂的情境中,Shelve为你提供了Python对象持久化的另一种方案。

创建一个新的Shelf

使用shelf最简单的方法是使用DbfilenameShelf类,它使用dbm来存储数据。这个类的实例可以通过shelve.open直接创建:

如果想再次访问该数据,打开shelf并像字典一样使用它。

讲上面两段代码运行一下,得到下面输出:

dbm模块不支持多个应用同时写入同一个数据库,但是确实支持并发的读取操作。如果一个客户端不应该修改shelf,那么添加参数flag="r",告诉shelf以只读模式打开。

如果一个只读模式打开的客户端,试图修改shelve的数据,那么会报错。异常类型根据dbm底层选用的数据库的不同会有所不同。

回写

默认情况下,shelve不会追踪对象的修改。这意味着,如果从shelve取出的对象的一部分被修改了,那么你必须明确地重新写入整个对象,才能将这个修改保存起来。

在这个例子中,key1代表的字典没有重新写入,所以当这个shelf重新打开时,key1代表的字典没有发生变化。

为了让shelves自动监测并保存对对象的修改,打开时加上writeback参数。有了writeback参数,shelve会在内存中为所有从数据库中取出的对象做一份缓存,当shelf被关闭时,这些缓存对象也会自动写回到数据库中。

虽然这个参数减少了编程出错的几率,并且使得回写过程更加透明,但是也有些情况不宜使用这个参数。shelf打开后,使用到的缓存会消耗额外的内存,并且关闭时,回写的过程会拖慢程序。所有缓存的对象都会回写到数据库,而不是修改的才会回写,因为shelve并没有记录哪些对象修改了。如果你的程序中修改的数据只占使用数据的一小部分,那么这个参数可能有点太耗费资源了。

特定Shelf类型

前面的例子中,我们都使用的是shelve的默认参数。打开数据库我们都使用的是shelve.open,而没有指定数据库类型。通常情况下这就够了,但是也有一些场景,数据库格式很重要。在这些情况下,直接使用DbfilenameShelf类或者BsdDbShelf类,甚至继承于Shelf,定制一个自己的类。

Shelve:对象的持久化存储的更多相关文章

  1. shelve -- 用来持久化任意的Python对象

    这几天接触了Python中的shelve这个module,感觉比pickle用起来更简单一些,它也是一个用来持久化Python对象的简单工具.当我们写程序的时候如果不想用关系数据库那么重量级的东东去存 ...

  2. python笔记5 接口类抽象类 封装 反射 设计模式 模块 :random随机数 josn shelve持久化存储

    接口类抽象类 接口类:接口类就是制定一个规则,让其他人按照我的规则去写程序. #!/usr/bin/env python from abc import ABCMeta,abstractmethod ...

  3. IOS开发-本地持久化存储sqlite应用

    前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程:                     我的第一个IOS开发应用    本章主要将介 ...

  4. iOS数据持久化存储:归档

    在平时的iOS开发中,我们经常用到的数据持久化存储方式大概主要有:NSUserDefaults(plist),文件,数据库,归档..前三种比较经常用到,第四种归档我个人感觉用的还是比较少的,恰恰因为用 ...

  5. ios开发之数据的持久化存储机制

    IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...

  6. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  7. Swift - 使用Core Data进行数据持久化存储

    一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. ...

  8. Vue-admin工作整理(十二):Vuex-插件(持久化存储)

    Vuex可以支持插件形式,来处理指定业务,比如:持久化存储的插件(当每次刷新浏览器的时候store里面的参数都会被清除,因为它是存在内存中的,而不是存在本地的,有时候我们希望将一些东西存在本地) 插件 ...

  9. 11.scrapy框架持久化存储

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

随机推荐

  1. RMQ(倍增法求ST)

    解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h& ...

  2. 如何实现浏览器的Console功能

    离 JS-Encoder 的最初版本发布已经过了大半年的时间,这段时间除了偶尔修复一下 BUG 外,主要还是忙于学业.最近一段时间不太平,开学时间也大大延迟,加上自己本身对自己的在线编译器不是很满意, ...

  3. FME中按照ID值过滤块参照中的多个要素

  4. HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法

    之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...

  5. java.lang.NoSuchMethodException: java.util.List.<init>()

    报错信息如下 java.lang.NoSuchMethodException: java.util.List.<init>() at java.lang.Class.getConstruc ...

  6. 「SpringBoot」如何优雅地管理SpringBoot项目

    本文主要讲述一下如何优雅地管理SpringBoot项目. 背景 课堂上,当小明形如流水地回答完沐芳老师提出来的问题时,却被至今没有对象的胖虎无情嘲讽了? 沐芳老师:小明,你平时是如何启动.停止你的Sp ...

  7. .gitattributes

    .gitattributes文件是一个文本文件,文件中的一行定义一个路径的若干属性.以行为单位设置一个路径下所有文件的属性,格式如下: 要匹配的文件模式 属性1 属性2 GRLF和LF CRLF,LF ...

  8. Scratch2的鸡兔同笼

    解题思路鸡兔同笼新算法:已知共有鸡和兔15只,共有40只脚,问鸡和兔各有几只.算法:假设鸡和兔训练有素,吹一声哨,它们抬起一只脚,(40-15=25) .再吹一声哨,它们又抬起一只脚,(25-15=1 ...

  9. 【Linux】Linux(一)Linux常用命令

    一 命令行提示符 1.[root@localhost ~]# 当前登录用户@主机名:当前所在目录$ # 超级用户 $  普通用户 当前所在目录:~ 用户家目录 管理员 /root 普通用户 /home ...

  10. 7L-双线链表实现

    链表是基本的数据结构,尤其双向链表在应用中最为常见,LinkedList 就实现了双向链表.今天我们一起手写一个双向链表. 文中涉及的代码可访问 GitHub:https://github.com/U ...