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

121 lines
7.8 KiB
Markdown
Raw Permalink Normal View History

2024-10-20 12:24:46 +08:00
# 简要的 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)