目的: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. Magenta Demos Magenta 实战代码

    Magenta 实战代码 这个仓库包含了很多 Magenta 模型的实现.看 Magenta 库以及模型,看我们的主仓库:https://github.com/tensorflow/magenta A ...

  2. 使用 PyTorch 进行 风格迁移(Neural-Transfer)

    1.简介 本教程主要讲解如何实现由 Leon A. Gatys,Alexander S. Ecker和Matthias Bethge提出的Neural-Style 算法.Neural-Style 或者 ...

  3. MFC之登录框的问题处理

    1.在做登录框的时候,把登录框做成模态对话框,并且放在 主界面程序所在窗口打开之前.也就是放在主界面类的InitInstance()里.这样做就会在弹出主界面之前被登录框弹出模态框出来阻塞住. 1.但 ...

  4. Spring Boot 邮件发送

    pom文件依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. Springcloud config + zuul 搭建动态网关

    1,实现的效果,就是zuul 网关的配置路由实现负载均衡,zuul 的配置文件放在springcloud config 上 2,需要的服务如下: 3,其实就是配置下springcloud-zuul 的 ...

  6. ThreadAbortException是可以传递的

    今天在写线程Aborted代码时,发现嵌套的try catch中的ThreadAbortException错误是可以从内部传递到外部的,想想这也是必然的,在内部该线程已经中断了,外部必然是中断了,再仔 ...

  7. 关于泛型数据结构中OrderBy的使用

    形如, 1) ICollection<ImageInfo> imageInfos = new List<ImageInfoDTO>(); imageInfos = imageI ...

  8. NEKO's Maze Game - Codeforces 题解

    题目 NEKO#ΦωΦ has just got a new maze game on her PC! The game's main puzzle is a maze, in the forms o ...

  9. Dome 多人人脸识别 face_recognition

    Dome 多人人脸识别 face_recognition 注意 face_recognition 依赖 face_recognition_models 中文字体文件需要自己下载 1.多人人脸识别 # ...

  10. Python中的编码及操作文件

    ------------恢复内容开始------------ 1,字符编码 ASCII  用1个字符来表示所有的英文字母和特殊符号 GB2313(GBK)用2个字符来表示英文字母及中文字符,且决定如果 ...