Обычно, я кодирую следующим образом для получения конкретного объекта в переменной следующим образом
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
Я предлагаю создать подкласс 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
вместо всех строчных букв), возможно, потребуется некоторое внимание/доработки через несколько лет, но я бы не ожидал ничего серьезного.
Данные экземпляра для 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'}}
Правка:
Решение Алекса Мартелли чище, надежнее и красивее. Хотя это был принятый ответ, я бы предложил использовать его подход вместо этого.Смотрите его комментарий к этому решению для получения дополнительной информации.
Мне удалось получить ответ, но я думаю, что должен быть ответ получше.
dictionary = {}
for section in config.sections():
dictionary[section] = {}
for option in config.options(section):
dictionary[section][option] = config.get(section, option)