Прочитать все содержимое ini файла в словарь с Python - PullRequest
20 голосов
/ 11 июля 2010

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

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

Ответы [ 8 ]

30 голосов
/ 11 июля 2010

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

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 вместо этого, конечно) может потребоваться некоторое внимание / настройки через несколько летдорога, но я бы не ожидал ничего серьезного.

25 голосов
/ 11 июля 2010

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

dictionary = {}
for section in config.sections():
    dictionary[section] = {}
    for option in config.options(section):
        dictionary[section][option] = config.get(section, option)
10 голосов
/ 11 июля 2010

Данные экземпляра для 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'}}

Edit:

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

9 голосов
/ 11 апреля 2016

Я знаю, что этот вопрос был задан 5 лет назад, но сегодня я сделал это в словах:

parser = ConfigParser()
parser.read(filename)
confdict = {section: dict(parser.items(section)) for section in parser.sections()}
1 голос
/ 09 декабря 2012

Как разобрать ini-файл в py?

import ConfigParser
config = ConfigParser.ConfigParser()
config.read('/var/tmp/test.ini')
print config.get('DEFAULT', 'network')

Где файл test.ini содержит:

[DEFAULT]
network=shutup
others=talk
0 голосов
/ 19 мая 2019

предположим, файл: config.properties содержит следующее:

  • k = v
  • k2 = v2
  • k3 = v3

код питона:

def read_config_file(file_path):
        with open(file=file_path, mode='r') as fs:
            return {k.strip(): v.strip() for i in [l for l in fs.readlines() if l.strip() != ''] for k, v in [i.split('=')]}


print('file as dic: ', read_config_file('config.properties'))
0 голосов
/ 01 февраля 2017

из https://wiki.python.org/moin/ConfigParserExamples

def ConfigSectionMap(section):
dict1 = {}
options = Config.options(section)
for option in options:
    try:
        dict1[option] = Config.get(section, option)
        if dict1[option] == -1:
            DebugPrint("skip: %s" % option)
    except:
        print("exception on %s!" % option)
        dict1[option] = None
return dict1
0 голосов
/ 30 сентября 2016

Еще одна вещь, которую нужно позаботиться, - ConfigParser преобразует значения ключей в нижний регистр, следовательно, в случае, если вы преобразуете записи конфигурации в словарь, проверьте ваши требования. Я столкнулся с проблемой из-за этого. Для меня у меня были ключи от верблюжьего корпуса, поэтому мне пришлось изменить некоторое количество кода, когда я начал использовать словарь вместо файлов. ConfigParser.get() метод внутренне преобразует ключ в нижний регистр.

...