Python 的 Configparser 模块

2024年8月29日 | 阅读 8 分钟

Python 内置的 ConfigParser 库是基础模块的一部分。该库提供了一个控制台解析器,用于轻松配置由名称-键值对组成的文件。

此库支持的全球流行的约定是“INI”语法,最常用于 Microsoft 平台。该库最初是为了帮助处理一种不同的语言结构而创建的,其中每个部分的项都类似于 RFC 822 标头。

该实现允许使用任一语法指定命名值。这种隐性的失误和“INI”格式缺乏明确的定义使得该模块的维护工作非常单调,因此该实现在几乎每个 Python 版本中都进行了更改,并且该模块的行为被证明非常难以描述。

要点

  • 默认值的持续行为始终是预期的。
  • 该模块旨在支持一套程序,这些程序可以提供一些直接使用或构成其他属性(例如,包含运行程序的计算机主机名的路径名)部分的信息。
  • 当时,没有必要区分“默认”值的不同用途,正如 MartinManey 在下面建议的那样。(目前对我来说不清楚,是否有真正的必要这样做,因为 ConfigParser 提供的 API 非常简洁。)
  • 当前实现中为当前“默认值”使用“魔法部分名称”是我认为不幸的事情;默认字典应该与部分字典不同。
  • 如果将来考虑额外的命名间隔(“默认类型”),我希望它们不会因为愚蠢的意外而成为组织部分名称的一部分。
  • 通过 write() 方法合并默认值是不幸的;这些旨在作为应用程序提供计算值的一种方式,如果特定的设置没有覆盖它们,则将使用这些值。
  • Python 标准库中的 configparser 模块定义了用于读取和写入 Microsoft Windows 操作系统所使用的设置文件的功能。
  • 此类文件通常具有 .INI 扩展名。
  • INI 文件由以 [section] 标头开头的各个部分组成。在方括号之间,我们可以放置部分的名称。
  • 部分后面是键/值条目,由 = 或 : 字符分隔。它可能包含以 # 或 ; 符号为前缀的注释。

下面显示了一个示例 INI 文件。

ConfigParser 类属于 configparser 模块。它必须管理解析内容的数据库并解析所有配置文件。

ConfigParser 类的任何对象都由以下行创建 -

以下是 ConfigParser 类对象使用的方法:

write() 方法以 .ini 格式了解配置状态。
read_dict() 方法从字典中读取配置。关键概念对段名很重要,值是包含应该在段中可用的键和值的字典。
read_string() 方法从任何字符串读取配置。
remove_option() 方法从部分的任何部分中移除任何选项。
has_option() 方法返回部分的任何部分中是否存在任何选项。
has_section() 方法返回部分的任何部分是否存在。
read() 方法读取和解析任何配置文件。
items() 方法返回一个元组,其中包含部分中每个选项的 (值, 名称)。
getboolean() 方法与 get() 方法类似,但将值转换为布尔值。返回 True 或 False 值。
options() 方法返回部分名称的配置选项列表。
read_file() 方法读取和解析一个配置文件,作为文件对象。
getint() 方法与 get() 类似,但将值转换为整数。
get() 方法返回指定选项的字符串值。
getfloat() 方法与 get() 类似,但将值转换为浮点数。
sections() 方法返回所有配置部分的名称。
remove_section() 方法移除任何文档部分和其所有选项。
set() 方法设置任何选项。

以下脚本解析并读取 'sampleconfigfile.ini' 文件

输出

Sections: Settings
detailedlog = 1
runstatus = 1
statusport = 6099
statusrefresh = 10
archive = 1
logfile = /opt/ecs/mvuser/MV_IPTel/log/MV_IPTel.log
version = 0.9 Build 4
servername = Unknown

Section: FTP
runftp = 1
ftpport = 21
ftpdir = /opt/ecs/mvuser/MV_IPTel/data/FTPdata
username = admin
password = admin

要构建配置文件,使用 write() 方法。以下代码配置 parser_name 的对象,并对名为 'testing.ini' 的文件对象执行写入操作。

支持的数据类型

在配置文件中,Config 解析器不能假设值的数据类型,始终将其内部保留为字符串。这意味着如果我们需要其他数据类型,我们必须隐式转换。

由于这项工作非常普遍,Config 解析器提供了一系列有用的 getter 方法来处理数字、浮点数和布尔值。最后一个是最有趣的,因为将值传递给 bool() 没有用,因为 bool('true') 仍然是 false。这就是为什么 Config 解析器还提供了 getboolean()。此方法不区分大小写,并识别 'no'/'yes'、'false'/'true'、'off'/'on' 和 '0'/'1' 中的布尔值。

例如

Config 解析器不仅提供 getboolean() 方法,还提供类似的 getfloat() 和 getint() 方法。

备用值

在字典中,要提供备用值,我们将使用部分的 get() 函数。

请注意,默认值优先于备用值。例如,在我们的模型中,'CompressionLevel' 键仅在 'DEFAULT' 区域中确定。如果我们尝试从 'top_secret.server.com' 部分获取它,我们将始终获得默认值,即使我们指定了备用值。

另一件需要了解的事情是,parser_name 级别的 get() 方法提供了一个自定义的、更复杂的接口,为保持向后兼容性而保留。使用此方法时,可以使用 fallback_ 关键字仅参数提供 fallback_ 值。

同样的 fallback_ 参数可以与 getint()、getfloat() 和 getboolean() 方法一起使用,例如:

INI 文件支持的格式

每个配置文件都有部分,每个部分由标题 -> 部分定义,后面跟着键/值类型的条目,然后由字符串(: 或 =)分区。尾随和前导空格与值和键分开。

如果解析器配置允许,可以删除值,在这种情况下,值/键句号也可以省略。值还可以跨多行,只要它们比值的第一行缩进更多。根据解析器的模式,空行可能被视为多行值的一部分或被忽略。

默认情况下,任何部分名称都可以是任何不包含 ']' 或 '\n' 的字符串。

设计文档可以包含以特定字符(; 和 #)为前缀的注释。注释可以单独出现在几乎空行上,可能带有缩进。

例如

异常

  1. 异常名称:DuplicateSectionError
    描述:如果使用已存在的节名称调用 add_section() 函数,或者在严格的解析器中,当在单个输入文件、字符串或字典中发现节一次时,会引发异常。
    版本 3.1 新增:添加了可选的 lineno、source 属性和 __init__() 的参数。
  2. 异常名称:NoSectionError
    描述:当未找到指定节时引发异常。
  3. 异常名称:NoOptionError
    描述:当在指定节中未找到指定选项时引发异常。
  4. 异常名称:DuplicateOptionError
    描述:如果在一个文档、字符串或词典中读取时,某个选项出现两次,则由严格的解析器引发错误。这可以捕获拼写错误和与大小写敏感相关的错误;例如,一个词典可能有两个键表示相同的、对大小写不敏感的设置键。
  5. 异常名称:InterpolationDepthError
    描述:当字符串插值的任何长度无法完成,因为迭代次数超过 MAX_INTERPOLATION_DEPTH 时,会引发异常。此异常是 InterpolationError 的子类。
  6. 异常名称:InterpolationError
    描述:执行字符串插值时发生错误的基础类。
  7. 异常名称:InterpolationMissingOptionError
    描述:当值中引用的选项不存在时,会引发此异常。此错误是 InterpolationError 的子类。
  8. 异常名称:MissingSectionHeaderError
    描述:尝试解析文档时,如果缺少节标题,则会引发异常。
  9. 异常名称:InterpolationSyntaxError
    描述:当进行替换的文本源不符合所需语法时,会引发异常。它是 InterpolationError 的子类。
  10. 异常名称:Error
    描述:所有其他 configparser_name 错误的基类。
  11. 异常名称:ParsingError
    描述:当发生错误时,尝试解析文档时会引发异常。
    版本 3.2 更改:filename 属性和 __init__() 参数为保持一致性而更名为 source。