Встроенные комментарии для ConfigParser - PullRequest
4 голосов
/ 29 февраля 2012

У меня есть такие вещи в файле .ini

[General]
verbosity = 3   ; inline comment

[Valid Area Codes]
; Input records will be checked to make sure they begin with one of the area 
; codes listed below.  

02    ; Central East New South Wales & Australian Capital Territory
03    ; South East Victoria & Tasmania
;04    ; Mobile Telephones Australia-wide
07    ; North East Queensland
08    ; Central & West Western Australia, South Australia & Northern Territory

Однако у меня проблема в том, что встроенные комментарии работают в строке key = value, а не в key без строк значения. Вот как я создаю свой объект ConfigParser:

>>> import ConfigParser
>>> c = ConfigParser.SafeConfigParser(allow_no_value=True)
>>> c.read('example.ini')
['example.ini']
>>> c.get('General', 'verbosity')
'3'
>>> c.options('General')
['verbosity']
>>> c.options('Valid Area Codes')
['02    ; central east new south wales & australian capital territory', '03    ; south east victoria & tasmania', '07    ; north east queensland', '08    ; central & west western australia, south australia & northern territory']

Как настроить парсер конфигурации, чтобы встроенные комментарии работали в обоих случаях?

Ответы [ 3 ]

10 голосов
/ 29 февраля 2012

Согласно документации ConfigParser

"Файлы конфигурации могут содержать комментарии с префиксом определенных символов (# и;). Комментарии могут появляться самостоятельно в пустой строке, или может вводиться в строках, содержащих значения или имена разделов "

В вашем случае вы добавляете комментарии в строках, содержащих только ключи без значений (следовательно, это не будет работать), и именно поэтому вы получаете этот вывод.

СМОТРИТЕ: http://docs.python.org/library/configparser.html#safeconfigparser-objects

2 голосов
/ 12 апреля 2019

[EDIT]

Modern ConfigParser поддерживает встроенные комментарии.

settings_cfg = configparser.ConfigParser(inline_comment_prefixes="#")

Однако, если вы хотите тратить объявление функции для поддерживаемых методов, вот мой оригинальный пост:


[ORIGINAL]

Как указано в SpliFF, в документации сказано, что встроенные комментарии - это нет-нет.В качестве значения передается все, что находится справа от первого двоеточия или знака равенства, включая разделители комментариев.

Что отстой.

Итак, давайте исправим это:

def removeInlineComments(cfgparser):
    for section in cfgparser.sections():
        for item in cfgparser.items(section):
            cfgparser.set(section, item[0], item[1].split("#")[0].strip())

Вышеупомянутая функция просматривает каждый элемент в каждом разделе объекта configParser, разбивает строку на любой символ '#', затем отбрасывает любой пробел () от переднего или заднего края оставшегося значения и записывает только значение, без встроенных комментариев.

Вот более питонная, (возможно, менее разборчивая) версия для понимания списков этой функции, которая позволяет вам указать, на какой символ разбивать:

def removeInlineComments(cfgparser, delimiter):
    for section in cfgparser.sections():
        [cfgparser.set(section, item[0], item[1].split(delimiter)[0].strip()) for item in cfgparser.items(section)]
0 голосов
/ 29 февраля 2012

Возможно, вместо этого попробуйте 02= ; comment.

...