geekdoc-python-zh/docs/pythonlibrary/a-brief-configobj-tutorial.md

121 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 简要的 ConfigObj 教程
> 原文:<https://www.blog.pythonlibrary.org/2010/01/01/a-brief-configobj-tutorial/>
Python 附带了一个方便的模块,叫做 [ConfigParser](http://docs.python.org/library/configparser.html) 。这对于创建和读取配置文件(又名 INI 文件)很有好处。然而,迈克尔·福德(《T2》的作者)和[尼古拉·拉罗萨](http://www.teknico.net/)决定编写他们自己的配置模块,名为 [ConfigObj](http://www.voidspace.org.uk/python/configobj.html) 。在许多方面,它是对标准库模块的改进。当我第一次看 ConfigObj 的主页时,我认为它有很好的文档,但它似乎没有任何完整的功能片段。由于我从 docs plus examples 中学习,我发现在没有示例的情况下开始使用 ConfigObj 会更加困难。当我开始写这篇文章时,我并不知道迈克尔·福德已经就这个主题写了自己的[教程](http://www.voidspace.org.uk/python/articles/configobj.shtml);但是我承诺过我会写我自己的,所以这就是你今天要读的!
## 入门指南
首先,您需要[下载 ConfigObj](http://www.voidspace.org.uk/python/modules.shtml#configobj) 。一旦你下载并安装,我们可以继续。明白了吗?那我们就看看它能做什么吧!
首先,打开一个文本编辑器,创建一个包含如下内容的文件:
`product = Sony PS3
accessories = controller, eye, memory stick
# This is a comment that will be ignored
retail_price = $400`
把它保存在你喜欢的任何地方。我将把我的命名为“config.ini”。现在让我们看看如何使用 ConfigObj 来提取这些信息:
`>>> from configobj import ConfigObj
>>> config = ConfigObj(r"path to config.ini")
>>> config["product"]
'Sony PS3'
>>> config["accessories"]
['controller', 'eye', 'memory stick']
>>> type(config["accessories"])`
可以看到ConfigObj 使用 Python 的 dict API 来访问它提取的信息。要让 ConfigObj 解析文件,只需将文件的路径传递给 ConfigObj。现在如果信息在一个部分下(即[Sony]),那么您必须使用["Sony"],像这样:config["Sony"]["product"]预先挂起所有内容。还要注意“附件”部分是作为字符串列表返回的。ConfigObj 将接受任何带有逗号分隔列表的有效行,并将其作为 Python 列表返回。您也可以在配置文件中创建多行字符串,只要用三个单引号或双引号将它们括起来。
如果您需要在文件中创建一个子节,那么使用额外的方括号。比如,[索尼]是顶节,[[Playstation]]是子节,[[[PS3]]]是子节的子节。您可以创建任意深度的子部分。有关文件格式的更多信息,我推荐上面链接的文档。
现在我们将反向操作,以编程方式创建配置文件。
```py
import configobj
def createConfig(path):
config = configobj.ConfigObj()
config.filename = path
config["Sony"] = {}
config["Sony"]["product"] = "Sony PS3"
config["Sony"]["accessories"] = ['controller', 'eye', 'memory stick']
config["Sony"]["retail price"] = "$400"
config.write()
```
如您所见,只需要 8 行代码。在上面的代码中,我们创建了一个函数,并将配置文件的路径传递给它。然后我们创建一个 ConfigObj 对象并设置它的*文件名*属性。为了创建这个部分我们创建一个名为“Sony”的空 dict。然后我们以同样的方式预处理每一行的内容。最后我们调用配置对象的 *write* 方法将数据写入文件。
## 使用配置规范
ConfigObj 还提供了一种使用 *configspec* 来验证配置文件的方法。当我提到我将要写这篇文章时Steven Sproat([Whyteboard](https://launchpad.net/whyteboard)的创建者)主动提供了他的 [configspec 代码](http://bazaar.launchpad.net/~sproaty/whyteboard/development/annotate/head%3A/utility.py)作为例子。我采用了他的规范,并用它来创建一个默认的配置文件。在这个例子中,我们使用 Foord 的 [validate](http://www.voidspace.org.uk/python/validate.html) 模块来进行验证。我不认为它包含在您的 ConfigObj 下载中,所以您可能也需要下载它。现在,让我们看一下代码:
```py
import configobj, validate
cfg = """
bmp_select_transparent = boolean(default=False)
canvas_border = integer(min=10, max=35, default=15)
colour1 = list(min=3, max=3, default=list('280', '0', '0'))
colour2 = list(min=3, max=3, default=list('255', '255', '0'))
colour3 = list(min=3, max=3, default=list('0', '255', '0'))
colour4 = list(min=3, max=3, default=list('255', '0', '0'))
colour5 = list(min=3, max=3, default=list('0', '0', '255'))
colour6 = list(min=3, max=3, default=list('160', '32', '240'))
colour7 = list(min=3, max=3, default=list('0', '255', '255'))
colour8 = list(min=3, max=3, default=list('255', '165', '0'))
colour9 = list(min=3, max=3, default=list('211', '211', '211'))
convert_quality = option('highest', 'high', 'normal', default='normal')
default_font = string
default_width = integer(min=1, max=12000, default=640)
default_height = integer(min=1, max=12000, default=480)
imagemagick_path = string
handle_size = integer(min=3, max=15, default=6)
language = option('English', 'English (United Kingdom)', 'Russian', 'Hindi', default='English')
print_title = boolean(default=True)
statusbar = boolean(default=True)
toolbar = boolean(default=True)
toolbox = option('icon', 'text', default='icon')
undo_sheets = integer(min=5, max=50, default=10)
"""
def createConfig(path):
"""
Create a config file using a configspec
and validate it against a Validator object
"""
spec = cfg.split("\n")
config = configobj.ConfigObj(path, configspec=spec)
validator = validate.Validator()
config.validate(validator, copy=True)
config.filename = path
config.write()
if __name__ == "__main__":
createConfig("config.ini")
```
如果你去看看 Steven 的原始 configspec你会注意到我把他的语言列表缩短了不少。我这样做是为了让代码更容易阅读。无论如何 [configspec](http://www.voidspace.org.uk/python/configobj.html#configspec) 允许程序员指定为配置文件中的每一行返回什么类型。它还可以用来设置默认值、最小值和最大值(等等)。如果您运行上面的代码您会看到在当前工作目录中生成了一个“config.ini”文件其中只有默认值。如果程序员没有指定默认值那么这一行甚至不会被添加到配置中。
让我们仔细看看发生了什么,以确保您理解。在 *createConfig* 函数中,我们通过传入文件路径并设置 configspec 来创建一个 *ConfigObj* 实例。请注意configspec 也可以是普通的文本文件或 python 文件,而不是本例中的字符串。接下来,我们创建一个*验证器*对象。正常的用法是只调用*config . validate(validator)*,但是在这段代码中,我将 *copy* 参数设置为 *True* ,这样我就可以创建一个文件。否则,它只会验证我传入的文件是否符合 configspec 的规则。最后,我设置配置的文件名*并写出数据。*
## 包扎
现在,您已经了解了 ConfigObj 的来龙去脉。我希望你会和我一样觉得它很有帮助。还有很多东西要学,所以一定要看看下面的一些链接。
*注意:所有代码都是在 Windows XP 上用 Python 2.5、ConfigObj 4.6.0 和 Validate 1.0.0 测试的。*
**延伸阅读**
* [ConfigObj 官方文档](http://www.voidspace.org.uk/python/configobj.html)
* [验证官方文件](http://www.voidspace.org.uk/python/validate.html)
* [迈克尔·福德的 ConfigObj 教程](http://www.voidspace.org.uk/python/articles/configobj.shtml)
**下载源码**
* [configObjTut.zip](https://www.blog.pythonlibrary.org/wp-content/uploads/2010/01/configObjTut.zip)
* [configObjTut.tar](https://www.blog.pythonlibrary.org/wp-content/uploads/2010/01/configObjTut.tar)