我使用Python的老式configparser模块从文件系统读取配置文件。
若要检查用户提供的配置文件是否使用正确的“语法”,请将所有节键和子键与包含所有允许的节键和子键以及ommited值的引用配置文件进行比较。
分析特定于用户的文件不是什么大事,而且工作得很好。但是,读取引用配置会导致如下的ref_config.ini

ParsingError: Source contains parsing errors: 'ref_config.ini'
    [line  2]: 'rotations_to_simulate\n'
    [line  3]: 'number_of_segments\n'
    [line  4]: 'material_data\n'
    [line  7]: 'rpm\n'

文件ParsingError包含以下行:
[GENERAL DATA]
rotations_to_simulate
number_of_segments
material_data

[TECHNICAL DATA]
rpm

要读取上述配置文件,请使用以下代码:
#!/usr/bin/env python3
# coding: utf-8

import configparser
import os.path

def read_ref_config():
    config = configparser.ConfigParser()
    if not os.path.isfile('ref_config.ini'):
        return False, None
    else:
        config.read('ref_config.ini')
        return True, config

但是,在配置文件中输入值不应该导致ParsingError,因为docs告诉:
值可以省略,在这种情况下,键/值分隔符也可以
被排除在外。
[No Values]
key_without_value
empty string value here =

更新:
我只是将给定example from the docs的内容复制并粘贴到我的ref_config.ini文件中,得到了一个类似的ParsingError,其中NoValue键不包含任何空格:
ParsingError: Source contains parsing errors: 'ref_config.ini'
    [line 20]: 'key_without_value\n'

最佳答案

简单的方法。

configparser.ConfigParser(allow_no_value=True)

根据configparse docs
>>> import configparser

>>> sample_config = """
... [mysqld]
...   user = mysql
...   pid-file = /var/run/mysqld/mysqld.pid
...   skip-external-locking
...   old_passwords = 1
...   skip-bdb
...   # we don't need 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'

>>> # Settings without values provide None:
>>> config["mysqld"]["skip-bdb"]

>>> # Settings which aren't specified still raise an error:
>>> config["mysqld"]["does-not-exist"]
Traceback (most recent call last):
  ...
KeyError: 'does-not-exist'

关于python - configparser:解析错误,省略值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31029768/

10-09 03:36