如果该部分不存在,如何自动创建它?

时间:2019-12-31 02:22:42

标签: python-3.x configparser

如果我尝试写一个尚不存在的部分,则会得到一个configparser.NoSectionError

from conf

igparser import ConfigParser

c = ConfigParser()

c['a'] = {'x': 1}
c['a']['y'] = '2'
c.set(section='a', option='z', value='3')

for i in c:
    print(f'Section {i}:')
    for j in c[i]:
        print(f'\t{j}: {c[i][j]}')

# KeyError
c['b']['u'] = '0'

# NoSectionError
c.set('b', 'u', '0')

真的没有办法要求ConfigParser设置值,并创建一个不存在的节吗?检查某个节是否存在,并每次创建它似乎都是一个乏味的设计。

1 个答案:

答案 0 :(得分:0)

这不能直接完成。但是,存在基于ConfigParser对象的read_dict方法的权衡。想法是定义一个仅包含节名称的假字典,每个节名称都与一个空字典相关联。这是您以前的代码中插入的技巧:

from configparser import ConfigParser

c = ConfigParser()
c.read_dict({'a':{},'b':{},'c':{}})

c['a']['x'] = '1'
c['a']['y'] = '2'
c.set(section='a', option='z', value='3')
c['b']['u'] = '0'
c.set('c', 'v', '0')

for i in c:
    print(f'Section {i}:')
    for j in c[i]:
        print(f'\t{j}: {c[i][j]}')

您会看到:没有更多错误,也不需要为每个新的部分名称使用add_section()

但是,当然,您可以定义比假字典更有用的内容。例如,上面给出的整个配置结构可以用一行创建:

c.read_dict(dict(a=dict(x=1, y=2, z=3), b=dict(u=0), c=dict(v=0)))

或使用其他语法:

c.read_dict({'a':{'x':1, 'y':2, 'z':3}, 'b':{'u':0}, 'c':{'v':0}})