Считайте все содержание в ini файле в словарь с Python

Обычно, я кодирую следующим образом для получения конкретного объекта в переменной следующим образом

try:
    config = ConfigParser.ConfigParser()
    config.read(self.iniPathName)
except ConfigParser.MissingSectionHeaderError, e:
    raise WrongIniFormatError(`e`)

try:
    self.makeDB = config.get("DB","makeDB")
except ConfigParser.NoOptionError:
    self.makeDB = 0

Там какой-либо путь состоит в том, чтобы считать все содержание в словаре Python?

Например,

[A]
x=1
y=2
z=3
[B]
x=1
y=2
z=3

вписан

val["A"]["x"] = 1
...
val["B"]["z"] = 3
20
задан Daniel A. White 12 May 2015 в 14:10
поделиться

3 ответа

Я предлагаю создать подкласс ConfigParser.ConfigParser (или SafeConfigParser, &c) для безопасного доступа к "защищенным" атрибутам (имена, начинающиеся с одного подчеркивания -- "приватными" будут имена, начинающиеся с двух подчеркиваний, к которым нельзя обращаться даже в подклассах.... ):

import ConfigParser

class MyParser(ConfigParser.ConfigParser):

    def as_dict(self):
        d = dict(self._sections)
        for k in d:
            d[k] = dict(self._defaults, **d[k])
            d[k].pop('__name__', None)
        return d

Это эмулирует обычную логику парсеров конфигурации, и гарантированно работает во всех версиях Python, где есть модуль ConfigParser.py (вплоть до 2.7, которая является последней из серии 2.* - знание того, что в будущем не будет никаких версий Python 2.any, является способом гарантированной совместимости).

Если вам нужно поддерживать будущие версии Python 3.* (до 3.1 и, возможно, до грядущей 3.2 все будет в порядке, просто переименуйте модуль в configparser вместо всех строчных букв), возможно, потребуется некоторое внимание/доработки через несколько лет, но я бы не ожидал ничего серьезного.

31
ответ дан 29 November 2019 в 22:33
поделиться

Данные экземпляра для ConfigParser хранятся внутри в виде вложенного диктата. Вместо того, чтобы воссоздавать его, вы можете просто скопировать его.

>>> import ConfigParser
>>> p = ConfigParser.ConfigParser()
>>> p.read("sample_config.ini")
['sample_config.ini']
>>> p.__dict__
{'_defaults': {}, '_sections': {'A': {'y': '2', '__name__': 'A', 'z': '3', 'x': '1'}, 'B':         {'y': '2', '__name__': 'B', 'z': '3', 'x': '1'}}, '_dict': <type 'dict'>}
>>> d = p.__dict__['_sections'].copy()
>>> d
{'A': {'y': '2', '__name__': 'A', 'z': '3', 'x': '1'}, 'B': {'y': '2', '__name__': 'B', 'z': '3', 'x': '1'}}

Правка:

Решение Алекса Мартелли чище, надежнее и красивее. Хотя это был принятый ответ, я бы предложил использовать его подход вместо этого.Смотрите его комментарий к этому решению для получения дополнительной информации.

10
ответ дан 29 November 2019 в 22:33
поделиться

Мне удалось получить ответ, но я думаю, что должен быть ответ получше.

dictionary = {}
for section in config.sections():
    dictionary[section] = {}
    for option in config.options(section):
        dictionary[section][option] = config.get(section, option)
27
ответ дан 29 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: