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

7.8 KiB
Raw Permalink Blame History

简要的 ConfigObj 教程

原文:https://www.blog.pythonlibrary.org/2010/01/01/a-brief-configobj-tutorial/

Python 附带了一个方便的模块,叫做 ConfigParser 。这对于创建和读取配置文件(又名 INI 文件)很有好处。然而,迈克尔·福德(《T2》的作者)和尼古拉·拉罗萨决定编写他们自己的配置模块,名为 ConfigObj 。在许多方面,它是对标准库模块的改进。当我第一次看 ConfigObj 的主页时,我认为它有很好的文档,但它似乎没有任何完整的功能片段。由于我从 docs plus examples 中学习,我发现在没有示例的情况下开始使用 ConfigObj 会更加困难。当我开始写这篇文章时,我并不知道迈克尔·福德已经就这个主题写了自己的教程;但是我承诺过我会写我自己的,所以这就是你今天要读的!

入门指南

首先,您需要下载 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]是子节的子节。您可以创建任意深度的子部分。有关文件格式的更多信息,我推荐上面链接的文档。

现在我们将反向操作,以编程方式创建配置文件。


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的创建者)主动提供了他的 configspec 代码作为例子。我采用了他的规范,并用它来创建一个默认的配置文件。在这个例子中,我们使用 Foord 的 validate 模块来进行验证。我不认为它包含在您的 ConfigObj 下载中,所以您可能也需要下载它。现在,让我们看一下代码:


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 允许程序员指定为配置文件中的每一行返回什么类型。它还可以用来设置默认值、最小值和最大值(等等)。如果您运行上面的代码您会看到在当前工作目录中生成了一个“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 测试的。

延伸阅读

下载源码