Списки в ConfigParser - PullRequest
       69

Списки в ConfigParser

145 голосов
/ 03 декабря 2008

Типичный файл, сгенерированный ConfigParser, выглядит так:

[Section]
bar=foo
[Section 2]
bar2= baz

Теперь, есть ли способ индексировать списки, например:

[Section 3]
barList={
    item1,
    item2
}

Смежный вопрос: Уникальные ключи Python ConfigParser для каждого раздела

Ответы [ 12 ]

1 голос
/ 31 октября 2012
import ConfigParser
import os

class Parser(object):
    """attributes may need additional manipulation"""
    def __init__(self, section):
        """section to retun all options on, formatted as an object
        transforms all comma-delimited options to lists
        comma-delimited lists with colons are transformed to dicts
        dicts will have values expressed as lists, no matter the length
        """
        c = ConfigParser.RawConfigParser()
        c.read(os.path.join(os.path.dirname(__file__), 'config.cfg'))

        self.section_name = section

        self.__dict__.update({k:v for k, v in c.items(section)})

        #transform all ',' into lists, all ':' into dicts
        for key, value in self.__dict__.items():
            if value.find(':') > 0:
                #dict
                vals = value.split(',')
                dicts = [{k:v} for k, v in [d.split(':') for d in vals]]
                merged = {}
                for d in dicts:
                    for k, v in d.items():
                        merged.setdefault(k, []).append(v)
                self.__dict__[key] = merged
            elif value.find(',') > 0:
                #list
                self.__dict__[key] = value.split(',')

Итак, теперь мой config.cfg файл, который может выглядеть так:

[server]
credentials=username:admin,password:$3<r3t
loggingdirs=/tmp/logs,~/logs,/var/lib/www/logs
timeoutwait=15

Можно разбить на достаточно мелкозернистые объекты для моего небольшого проекта.

>>> import config
>>> my_server = config.Parser('server')
>>> my_server.credentials
{'username': ['admin'], 'password', ['$3<r3t']}
>>> my_server.loggingdirs:
['/tmp/logs', '~/logs', '/var/lib/www/logs']
>>> my_server.timeoutwait
'15'

Это для очень быстрого разбора простых конфигов, вы теряете все возможности извлекать целые, bools и другие типы выходных данных без преобразования объекта, возвращенного из Parser, или повторного выполнения задания синтаксического анализа, выполненного анализатором. класс в другом месте.

0 голосов
/ 31 мая 2018

json.loads & ast.literal_eval, кажется, работает, но простой список в конфигурации обрабатывает каждый символ как байт, возвращая даже квадратную скобку ....

означает, что если в конфигурации fieldvalue = [1,2,3,4,5]

затем config.read(*.cfg) config['fieldValue'][0] возвращая [ вместо 1

...