自定义解析器行为 Python 模块configparser
利用ConfigParser模块来管理任何应用程序的用户文档和文件。文档格式被组织为部分;每个部分都可以包含用于协调数据的键值对匹配项。还支持使用Python的格式化字符串技术进行键值插入,以构建依赖于彼此的值(这对于URL和消息字符串特别有用)。
ConfigParser使用的文档格式类似于较旧版本的Microsoft Windows使用的格式。它由一个或多个命名的部分组成,每个部分都可以包含具有名称和值的个别选项。
通过搜索以“[”开头的行来识别配置文件部分。方括号之间的值是部分名称,除了方括号之外,可以包含任何字符。
自定义解析器行为
几乎有与使用它的应用程序一样多的INI设计格式变体。Python模块configparser在支持可用的最大合理INI样式集方面非常出色。历史背景主要决定了默认功能,几乎可以肯定,您希望自定义一些功能。
影响特定配置解析器工作方式的最常见方法是使用init()函数选项:
1. 默认值,默认值:None
此选项接受一个键值对的字典,最初将放置在DEFAULT部分中。这为支持不指定与报告的默认值相等的值的紧凑设置文件提供了丰富的方式。
以下是一个提示:如果要为特定部分指定默认值,在读取实际文件之前,请使用read_dict()函数。
2. dict_type, 默认值:dict
这个广泛的选项影响将来映射协议的工作方式和配置文件的外观。使用标准字典,每个部分都按照添加到解析器的顺序存储。选项在部分内也是如此。
可以使用代替字典的其他类型,例如,对写入进行部分和选项排序。
请注意:有一种方法可以在单个操作中添加一批键值对匹配项。当您在这些操作中使用标准字典时,键的顺序将被排序。例如:
Python控制台屏幕:
> > > > parser_ = configparser_.ConfigParser_()
> > > > parser_.read_dict({'section_1': {'firstkey': 'value__1',
. . . . 'secondkey': 'value__2',
. . . . 'thirdkey': 'value__3'},
. . . . 'section_2': {'keyA': 'value__A',
. . . . 'keyB': 'value__B',
. . . . 'keyC': 'value__C'},
. . . . 'section_3': {'foooo': 'x',
. . . . 'bar__': 'y',
. . . . 'baz': 'z'}
. . . . })
> > > > parser_.section_s()
['section_1', 'section_2', 'section_3']
> > > > [option for option in parser_['section_3']]
['foooo', 'bar__', 'baz']
3. 允许没有值,默认值:False
某些设置记录已知包含没有值的设置;然而,仍然要符合configparser支持的语法。可以使用构造函数的allow_no_value参数来指示应接受这些值:例如:
Python控制台显示:
> > > > import configparser
> > > > sample_config = """
. . . . [mysqld]
. . . . user = mysql_
. . . . pid-file = /var/run/mysqld/mysqld.pid
. . . . skip--external--locking
. . . . old_passwords = 1
. . . . skip--bdb
. . . . # we do not require ACID today
. . . . skip-innodb
. . . . """
> > > > config = configparser.ConfigParser(allow_no_value=True)
> > > > config.read_string(sample_config)
> > > > # Settings with values are treated as before:
> > > > config["mysqld"]["user"]
'mysql_'
> > > > # Setting without values provide None:
> > > > config["mysql_d"]["skip--bdb"]
> > > > # Setting which are not specified can raise any error:
> > > > config["mysql_d"]["do-not-exist"]
Traceback (most recent call last):
. . . .
KeyError: 'do-not-exist'
4. 分隔符,默认值:(‘:’, ‘=’)
分隔符是在段落中用来分隔键和值的子字符串。在一行中遇到的第一个分隔符被视为分割符。这意味着值(但不包括键)可以包含这些分隔符。
还可以参考space_around_delimiters参数以及ConfigParser.write()方法的用法。还有另一个配置是Comment prefixes,其默认值为 (‘ ; ‘, ‘ # ‘).
5. 内联注释前缀,默认值:None
注释前缀是在配置文件中标识合法注释起始位置的字符串。comment_prefixes仅在空行(或缩进的空行)上使用,而inline_comment_prefixes可以在每个合法值(例如节名、选项和空行)之后使用。默认情况下,禁用内联注释,‘#’和‘;’将作为整行注释的前缀。
在3.2版本中有所修改:在以前的版本中,comment_prefixes=(‘;’,’#’)和inline_comment_prefixes=(‘;’)的行为是相同的。
请注意,配置解析器不支持对注释前缀进行转义。使用inline_comment_prefixes可能会阻止用户使用作为注释前缀的字符来指定选项值。如果无法确定,请不要设置inline_comment_prefixes。在任何情况下,将注释前缀字符存储在多行值的开头的唯一方法是添加前缀,例如:
Python控制台显示:
> > > > from configparser import ConfigParser, ExtendedInterpolation
> > > > parser_ = ConfigParser(interpolation=ExtendedInterpolation())
> > > > # the default BasicInterpolation could be used as well
> > > > parser_.read_string("""
. . . . [DEFAULT]
. . . . hash_ = #
. . . .
. . . . [hash_es]
. . . . shebang =
. . . . {hash_}!//user//bin//env python
. . . .{hash_} - - - - *- - - - - coding: utf-8 -*-
. . . .
. . . . Xtensions =
. . . . enabled_Xtension
. . . . another_Xtension
. . . . #disabled_by_comments
. . . . yet_another_Xtension
. . . .
. . . . interpolation not necessary = if # is not at line_ start
. . . . even in multiline_ values = line_ #1
. . . . line_ #2
. . . . line_ #3
. . . . """)
> > > > print(parser_['hash_es']['shebangs'])
#!/user/bin/env python
# -*- coding: utf-8 -*-
> > > > print(parser_['hash_es']['Xtensions'])
enabled_Xtension
another_Xtension
yet_another_Xtension
> > > > print(parser['hash_es']['interpolation not necessary'])
if # is not at line_ start
> > > > print(parser['hash_es']['even in multiline_ values'])
line_ #1
line_ #2
line_ #3
6. 严格且默认值为True
当设置为True时,解析器在从单个源(使用read_file()函数、read_string()函数或read_dict()函数)读取时,不会考虑任何部分或选项的重复。建议在新应用程序中使用严格的解析器。
在3.2版本中有所改变:在以前的configparser版本中,默认行为是strict=False。
7. 值中的空行,默认值为True
在配置解析器中,值可以跨越多行,只要它们的缩进比包含它们的键要多。默认情况下,解析器还允许空行作为值的一部分。同时,键可以根据需要进行缩进,以增强可读性。因此,当配置文件变得庞大而复杂时,用户很容易忽略文件结构。例如:
Python控制台输出:
[Sections]
Key_s = multiline
values with a gotch
can = is a part of the value of 'keys.'
这可能是完全错误的,所以客户端可能需要检查是否使用了相对字体来修改文件。这就是为什么您的应用程序不需要空白行的值,您应该考虑拒绝它们。每次这样做时,都会使空白行分割成不同的键。在上面的示例中,它将创建两个键,key_s和can。
8. 默认节,默认值:configparser.DEFAULTSECT(即:“DEFAULT”)
允许为不同节或插入目的提供默认值的特殊部分的显示是这个库的一个有影响力的概念,它允许用户创建复杂的解释设置。此部分通常称为“DEFAULT”,但可以将其修改为突出显示另一个有效的部分名称。一些常见的值包括“general”或“normal”。给定的名称用于在从任何源读取时识别默认节,并在写回到文件时使用。可以使用parser_instance.default_section属性检索其最新值,并且可以在运行时进行修改(例如,从一个完全转到另一个配置时更改文件)。
9. 引入默认值:configparser.BasicInterpolation
通过提供自定义解释器,可以自定义插入行为。可以使用None关闭插入行为;ExtendedInterpolation()函数提供了一种更高级的变体,受zc.buildout启发。更多关于这一主题的详细信息请参见专门的文档部分。RawConfigParser的默认值为None。
10. 转换器,默认值:未设置
配置解析器提供了执行类型转换的选项值获取器。默认实现了getint()函数、getfloat()函数和getboolean()函数。