- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
步骤7(最后一步):把对象存储到数据库中
尽管我们的类按照计划工作,但是,它们创建的对象还不是真正的数据库记录。也就是说,如果我们关闭Python,实例也将消失——它们是内存中的临时性对象,而没有存储到文件这样的更为持久的媒介中,因此,未来程序运行的时候,它们不再可用。事实证明,让实例对象更加持久是很容易做到的,使用Python一项叫做对象持久化的功能——让对象在创建它们的程序退出之后依然存在。最为本教程的最后一步,让我们把对象持久化。
Pickle和Shelve
对象持久化通过3个标准的库模块来实现,这3个模块在Python中都可用:
pickle
任意Python对象和字节串之间的序列化
dbm(在Python 2.6中叫做anydbm)
实现一个可通过键访问的文件系统,以存储字符串
shelve
使用另两个模块按照键把Python对象存储到一个文件中
我们在第9章中学习文件基础知识的时候简单介绍过这些模块。它们提供了强大的数据存储选项。尽管我们不能在本教程或本书中完全介绍它们,它们还是很简单,一个简单的介绍就足够让你入门了。
pickle模块是一种非常通用的对象格式化和解格式化工具:对于内存中几乎任何的Python对象,它都能聪明地把对象转换为字节串,这个字节串可以随后用来在内存中重新构建最初的对象。pickle模块几乎可以处理我们所能够创建的任何对象,包括列表、字典、嵌套组合以及类实例。后者对于pickle来说特别有用,因为它们提供了数据(属性)和行为(方法),实际上,组合几乎等于“记录”和“程序”。由于pickle如此通用,所以我们可以不用编写代码来创建和解析对象的定制文本文件表示,它可以完全替代这些代码。通过在文件中存储一个对象的pickle字符串,我们可以有效地使其持久化:随后直接载入它并进行unpickle操作,就可以重新创建最初的对象。
尽管使用pickle本身把对象存储为简单的普通文件并随后载入它们是很容易的,但shelve模块提供了一个额外的层结构,允许按照键来存储pickle处理后的对象。Shelve使用pickle把一个对象转换为其pickle化的字符串,并将其存储在一个dbm文件中的键之下;随后载入的时候,shelve通过键获取pickle化的字符串,并用pickle在内存中重新创建最初的对象。这都很有技巧,但是,对于脚本来说,一个shelve的pickle化的对象看上去就像是字典[1]——我们通过键索引来访问、指定键来存储,并且使用len、in和dict.keys这样的字典工具来获取信息。Shelve自动把字典操作映射到存储在文件中的对象。
实际上,对于脚本来说,一个shelve和一个常规的字典之间唯一的编码区别就是,一开始必须打开shelve并且在修改之后必须关闭它。实际的效果是,一个shelve提供了一个简单的数据库来按照键存储和获取本地的Python对象,并由此使它们跨程序运行而保持持久化。它不支持SQL这样的查询工具,并且它缺乏在企业级数据库中可用的某些高级功能(例如,真正的事务处理),但是,一旦使用键获取了存储在shelve中的本地Python对象,就可以使用Python语言的所有功能来处理它。
[1]没错,在Python中,我们把"shelve"用作一个名词,这使得多年来和我合作的编辑以及我所使用的电子文件编辑器懊恼不已。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论