《Python语言及其应用》读书笔记(7)之第8章数据的归宿(关键词:数据)

来源:互联网 发布:mac os x系统更新失败 编辑:程序博客网 时间:2024/06/07 10:14

第8章数据的归宿

8.1 文件输入/输出

8.1.1 使用write()写文本文件

8.1.2 使用read()、readline()或者readlines()读文本文件

8.1.3 使用write()写二进制文件

8.1.4 使用read()读二进制文件

8.1.5 使用with自动关闭文件

Python 的上下文管理器(context manager)会清理一些资源,例如打开的文件。它的形式为 with expression as variable:

>>> with open('relativity', 'wt') as fout:...     fout.write(poem)...

完成上下文管理器的代码后,文件会被自动关闭

8.1.6 使用seek()改变位置

无论是读或者写文件, Python 都会跟踪文件中的位置。函数 tell() 返回距离文件开始处的字节偏移量。 函数 seek() 允许跳转到文件其他字节偏移量的位置。这意味着可以不用从头读取文件的每一个字节,直接跳到最后位置并只读一个字节也是可行的。

8.2 结构化的文本文件

对于简单的文本文件,唯一的结构层次是间隔的行。然而有时候需要更加结构化的文本,用于后续使用的程序保存数据或者向另外一个程序传送数据。
结构化的文本有很多格式,区别它们的方法如下所示。
- 分隔符,比如 tab(’\t’)、逗号(’,’)或者竖线(’|’)。逗号分隔值(CSV)就是这样的例子。
- ‘<’ 和 ‘>’ 标签,例如 XML 和 HTML。
- 标点符号,例如 JavaScript Object Notation(JSON2)。
- 缩进,例如 YAML(即 YAML Ain’t Markup Language 的缩写),要了解更多可以去搜索。
- 混合的,例如各种配置文件。
每一种结构化文件格式都能够被至少一种 Python 模块读写。

8.2.1 CSV

分隔符的文件一般用作数据交换格式或者数据库。你可以人工读入 CSV 文件,每一次读取一行,在逗号分隔符处将每行分开,并添加结果某些数据结构中,例如列表或者字典。但是,最好使用标准的 csv 模块,因为这样切分会得到更加复杂的信息。
- 除了逗号,还有其他可代替的分隔符: ‘|’ 和 ‘\t’ 很常见。
- 有些数据会有转义字符序列, 如果分隔符出现在一块区域内,则整块都要加上引号或者在它之前加上转义字符。
- 文件可能有不同的换行符, Unix 系统的文件使用 ‘\n’, Microsoft 使用 ‘\r\n’, Apple之前使用 ‘\r’ 而现在使用 ‘\n’。
- 在第一行可以加上列名。

8.2.2 XML

带分隔符的文件仅有两维的数据:行和列。如果你想在程序之间交换数据结构,需要一种方法把层次结构、序列、集合和其他的结构编码成文本。
XML 是最突出的处理这种转换的标记(markup) 格式,它使用标签(tag) 分隔数据。
XML 通常用于数据传送和消息,它存在一些子格式, 如RSS和Atom。
XML 的灵活性导致出现了很多方法和性能各异的 Python 库。
在 Python 中解析 XML 最简单的方法是使用 ElementTree。

8.2.3 HTML

8.2.4 JSON

JavaScript Object Notation(JSON, http://www.json.org)是源于 JavaScript 的当今很流行的数据交换格式, 它是 JavaScript 语言的一个子集,也是 Python 合法可支持的语法。对于Python 的兼容性使得它成为程序间数据交换的较好选择。

8.2.5 YAML

和 JSON 类似, YAML(http://www.yaml.org)同样有键和值,但主要用来处理日期和时间这样的数据类型。 标准的 Python 库没有处理 YAML 的模块,因此需要安装第三方库yaml(http://pyyaml.org/wiki/PyYAML)操作数据。 load() 将 YAML 字符串转换为 Python 数据结构,而 dump() 正好相反。

8.2.6 安全提示

8.2.7 配置文件

8.2.8 其他交换格式

8.2.9 使用pickle序列化

存储数据结构到一个文件中也称为序列化(serializing)。像 JSON 这样的格式需要定制的序列化数据的转换器。 Python 提供了 pickle 模块以特殊的二进制格式保存和恢复数据对象。

8.3 结构化二进制文件

8.4 关系型数据库

8.4.1 SQL

8.4.2 DB-API

8.4.3 SQLite

8.4.4 MySQL

8.4.5 PostgreSQL

8.4.6 SQLAlchemy

你可以在以下层级上使用 SQLAlchemy:
- 底层负责处理数据库连接池、执行 SQL 命令以及返回结果,这和 DB-API 相似;
- 再往上是 SQL 表达式语言,更像 Python 的 SQL 生成器;
- 较高级的是对象关系模型(ORM),使用 SQL 表达式语言,将应用程序代码和关系型数据结构结合起来。
随着内容的深入,上面提到的术语会变得熟悉。 SQLAlchemy 实现在前面几节提到的数据库驱动程序的基础上。因此不需要导入驱动程序,初始化的连接字符串会作出分配,例如:

dialect + driver :// user : password @ host : port / dbname

字符串中的值代表如下含义。
- dialect
数据库类型。
- driver
使用该数据库的特定驱动程序。
- user 和 password
数据库认证字符串。
- host 和 port
数据库服务器的位置(只有特定情况下会使用端口号 :port)。
- dbname
初始连接到服务器中的数据库。
表 8-5 列出了常见方言和对应的驱动程序。
这里写图片描述
1.引擎层
2.SQL表达式语言
3.对象关系映射

8.5 NoSQL数据存储

有些数据库并不是关系型的,不支持 SQL。它们用来处理庞大的数据集、支持更加灵活的数据定义以及定制的数据操作。 这些被统称为NoSQL(以前的意思是 no SQL,现在理解为 not only SQL)。

8.5.1 dbm family

dbm 格式在 NoSQL 出现之前已存在很久了,它们是按照键值对的形式储存, 封装在应用程序(例如网页浏览器)中, 来维护各种各样的配置。从以下角度看, dbm 数据库和 Python字典是类似的:
- 给一个键赋值,自动保存到磁盘中的数据库;
- 通过键得到对应的值。

8.5.2 memcached

memcached(http://memcached.org/)是一种快速的、内存键值对象的缓存服务器。它一般置于数据库之前, 用于存储网页服务器会话数据。
连接到一个 memcached 服务器之后,可以做以下事项:
- 赋值和取值
- 其中一个值的自增或者自减
- 删除其中一个键
数据在 memcached 并不是持久化保存的,后面的可能会覆盖早些写入的数据,这本来就是它的固有特性, 因为它作为一个缓存服务器,通过舍弃旧数据避免程序运行时内存不足的问题

8.5.3 Redis

Redis(http://redis.io/)是一种数据结构服务器(data structure server)。和 memcached 类似,Redis 服务器的所有数据都是基于内存的(现在也可以选择把数据存放在磁盘)。不同于memcached, Redis 可以实现:
- 存储数据到磁盘,方便断电重启和提升可靠性;
- 保存旧数据;
- 提供多种数据结构,不限于简单字符串。
Redis 的数据类型和 Python 很相近, Redis 服务器会是一个或多个 Python 应用程序之间共享数据的非常有帮助的中间件。

8.5.4 其他的NoSQL

8.6 全文数据库

参考文献:
1. 《Python语言及其应用》。

阅读全文
0 0
原创粉丝点击