【原创】Python3 配置文件解析模块 configparser

参考链接:
14.2. configparser — 配置文件解析器

1. 读配置文件

1.1 从配置文件读取

配置文件是由小节组成的,每个小节都有一个 [section] 标头,加上多个由特定字符串 (默认为 = 或 : 1) 分隔的键/值条目。 默认情况下小节名对大小写敏感而键对大小写不敏感。 键和值开头和末尾的空格会被移除。 值可以被省略,在此情况下键/值分隔符也可以被省略。 值还可以跨越多行,只要其他行带有比值的第一行更深的缩进。 依据解析器的具体模式,空白行可能被视为多行值的组成部分也可能被忽略。

配置文件可以包含注释,要带有指定字符前缀 (默认为 # 和 ; 1)。 注释可以单独出现于原本的空白行,并可使用缩进。

配置文件示例:

[DEFAULT]
serveraliveinterval = 45
compression = yes
compressionlevel = 9,'11',2
forwardx11 = yes

[bitbucket.org]
user = hg,
        tt,
        'sz',

[topsecret.server.com]
port = 50022
forwardx11 = no

命令行执行结果:

>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
  • 通过 read() 方法读取配置文件
>>> config.read('example.ini')  
['example.ini']
  • 配置文件中每一个 [] 代表一个 section, 其中 [DEFAULT] (“DEFAULT” 必须大写)代表默认 section。
  • 若指定的 section 中找不到对应的 key ,则会使用默认 section 中的 key。
  • sections() 方法显示所有的 section,但不会包括默认 section。
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
  • 可以通过 in 直接判断某个 section 是否存在。
  • 默认 section 也能判断。
>>> 'bitbucket.org' in config
True
>>> 'bitbucket.com' in config
False
>>> 'DEFAULT' in config
True
  • 也可以通过 has_section(section) 判断某个 section 是否存在。
  • 默认 section 不能判断。
>>> config.has_section('DEFAULT')
False
>>> config.has_section('bitbucket.org')
True
  • defaults() 方法显示默认 section 中的值,为一个 OrderedDict 类型的字典
>>> config.defaults()
OrderedDict([('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', "9,'11',2"), ('forwardx11', 'yes')])
  • options(section) 方法显示出指定 section 中的所有 key,同时也包括此 section 中没有,但默认 section 中的 key。
>>> config.options('topsecret.server.com')
['port', 'forwardx11', 'serveraliveinterval', 'compression', 'compressionlevel']
  • has_option(section, option) 可以判断指定 section 的指定 key 是否存在。 如果指定的 section 为 None 或空字符串,则会使用默认 section 判断。
>>> config.has_option('topsecret.server.com','port')
True
>>> config.has_option(None,'port')
False
>>> config.has_option(None,'compression')
True
  • value 值在配置文件中可以换行,但换行后开头至少需要有一个空格,且比 key 的位置靠右。
  • 每个 key 对应的 value 值均作为一个字符串存储。包括其中的换行符,逗号和引号等。
  • 可以直接使用类似于字典的方法获取 value 值。
>>> config['bitbucket.org']['User']
"hg,\ntt,\n'sz',"
>>> print(config['bitbucket.org']['User'])
hg,
tt,
'sz',
>>> config['DEFAULT']['compressionlevel']
"9,'11',2"
  • 也可使用 get(section, option, *, raw=False, vars=None[, fallback])
    获取指定名称的 section 的一个 option 的值。 如果提供了 vars,则它必须为一个字典。 option 的查找顺序为 vars*(如果有提供)、*section 以及 DEFAULTSECT。 如果未找到该键并且提供了 fallback,则它会被用作回退值。 可以提供 None 作为 fallback 值。
>>> config.get('DEFAULT', 'compressionlevel')
"9,'11',2"
  • section 可以赋值给变量。section 中的 value 会覆盖默认 section 中的 value。
>>> topsecret = config['topsecret.server.com']
>>> topsecret['ForwardX11']
'no'
  • 获取此 section 不存在的 key 时,会从默认 section 中取值。
>>> topsecret['compression']
'yes'
  • 注意:简单地将值传给 bool() 是没有用的,bool(‘False’) 仍然会是 True。
  • 因此,使用 getboolean(),getint() 和 getfloat() 方法转换 value 类型,且有三种使用方式。
>>> bool(topsecret['forwardx11'])
True
>>> topsecret.getboolean('ForwardX11')
False
>>> config['bitbucket.org'].getboolean('ForwardX11')
True
>>> config.getboolean('bitbucket.org', 'Compression')
True
  • getint() 用法类似
>>> topsecret.getint('port')
50022
>>> topsecret['port']
'50022'
  • 可以通过迭代输出某个 section 中的所有 key,这同时会输出此 section 中没有,但默认 section 中有的 key。
>>> for key in config['bitbucket.org']:print(key)
... 
user
serveraliveinterval
compression
compressionlevel
forwardx11
  • items(section, raw=False, vars=None),返回指定的 section 中的 key - value 对组成的列表。可使用 dict() 方法转成字典。
>>> config.items('topsecret.server.com')
[('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', "9,'11',2"), ('forwardx11', 'no'), ('port', '50022')]
>>> dict(config.items('topsecret.server.com'))
{'serveraliveinterval': '45', 'compression': 'yes', 'compressionlevel': "9,'11',2", 'forwardx11': 'no', 'port': '50022'}

14.2.3. fallback (回退值)
与字典类似,你可以使用某个小节的 get() 方法来提供回退值(笔者理解其实是字典中的默认值):

>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'

请注意默认值会优先于回退值。 例如,在我们的示例中 ‘CompressionLevel’ 键仅在 ‘DEFAULT’ 小节被指定。 如果你尝试在 ‘topsecret.server.com’ 小节获取它,我们将总是获取到默认值,即使我们指定了一个回退值:

>>> topsecret.get('CompressionLevel', '3')
'9'

1.2 从其他地方读取配置文件

  • read_file(f, source=None)
    从 f 读取并解析配置数据,它必须是一个产生 Unicode 字符串的可迭代对象(例如以文本模式打开的文件)。

  • read_string(string, source=’’)
    从字符串中解析配置数据。

  • read_dict(dictionary, source=’’)
    从任意一个提供了类似于字典的 items() 方法的对象加载配置。 键为节名称,值为包含节中所出现的键和值的字典。 如果所用的字典类型会保留顺序,则节和其中的键将按顺序加入。 值会被自动转换为字符串。
    此方法可被用于在解析器之间拷贝状态。

详细见:14.2.9. ConfigParser 对象

2. 写配置文件

TODO

你可能感兴趣的:(python,devops,python)