如何使用configparser跳过配置文件中的部分

时间:2016-02-08 14:09:26

标签: python python-2.7

我编写了一个代码,其中参数来自配置文件。 配置中的第一个参数是设置调试级别。

    config = ConfigParser.RawConfigParser()
    config.read('config.cfg')
    log_level = config.get('Logger','log_level' )

配置中还有其他部分,它们提供服务器IP和密码来扫描每个部分。

主要代码:

for section in config.sections():
    components = dict() #start with empty dictionary for each section
    env.user = config.get(section, 'server.user_name')
    env.password = config.get(section, 'server.password')
    host = config.get(section, 'server.ip')

从我的配置

[Logger]
#Possible values for logging are INFO, DEBUG and ERROR
log_level = DEBUG

[server1]
server.user_name = root
server.password = password
server.ip = 172.19.41.21
[server2]
server.user_name = root
server.password = password
server.ip = 172.19.41.21

现在我的代码说要检查每个部分以检索用户名和密码。由于第一部分不包含这些值,因此它失败了。如何查看每个部分的用户名和密码,如果不存在,请转到下一部分。我尝试检查NONE并转到下一部分。但是那段代码很难看而且失败了。像这样:

if env.user=='':
        next

有人可以帮助我继续前进吗?

3 个答案:

答案 0 :(得分:3)

将此代码添加到for循环的开头:

if not config.has_option(section, 'server.user_name'):
    continue

答案 1 :(得分:2)

由于只有第一部分不包含这些值,因此您可以使用iter函数。

sections = iter(config.sections())
next(sections)
for section in sections:
    # something(section)

或者@tjohnson提到:

for section in config.sections()[1:]:
    # something(section)

答案 2 :(得分:1)

另一种方法是捕获异常。

for section in config.sections():
    components = dict() #start with empty dictionary for each section
    try:
        env.user = config.get(section, 'server.user_name')
        env.password = config.get(section, 'server.password')
        host = config.get(section, 'server.ip')
    except ConfigParser.NoOptionError as e:
        continue # At least one required option is missing in the section, skip

优点是如果缺少任何选项,该部分将被忽略。

但是,如果您需要是原子的(例如,如果设置有问题) env.user如果由于server.ip不存在而最终忽略该部分,则可能 想要这样的东西。

for section in config.sections():
    components = dict() #start with empty dictionary for each section
    try:
        tmp_user = config.get(section, 'server.user_name')
        tmp_password = config.get(section, 'server.password')
        tmp_host = config.get(section, 'server.ip')
    except ConfigParser.NoOptionError as e:
        continue # At least one required option is missing in the section, skip
    else:
        env.user = tmp_user
        env.password = tmp_password
        host = tmp_host

在这种情况下,可能更容易使用has_option 3次。