Прочитайте все содержимое 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
Ответы
Ответ 1
Я предлагаю подклассификацию 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
, а не, конечно), возможно, потребуется некоторое внимание /tweaks несколько лет вниз по дороге, но я не ожидал ничего серьезного.
Ответ 2
Мне удалось получить ответ, но я ожидаю, что будет лучше.
dictionary = {}
for section in config.sections():
dictionary[section] = {}
for option in config.options(section):
dictionary[section][option] = config.get(section, option)
Ответ 3
Данные экземпляра для ConfigParser хранятся внутри как вложенный dict. Вместо того, чтобы воссоздать его, вы можете просто скопировать его.
>>> 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:
Alex Martelli решение является более чистым, более надежным и красивым. Хотя это был принятый ответ, я бы предложил использовать его подход. См. Его комментарий к этому решению для получения дополнительной информации.
Ответ 4
Я знаю, что этот вопрос был задан 5 лет назад, но сегодня я сделал это понимание понятным:
parser = ConfigParser()
parser.read(filename)
confdict = {section: dict(parser.items(section)) for section in parser.sections()}
Ответ 5
Как разобрать 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
Ответ 6
Еще одна вещь, о которой стоит заботиться, ConfigParser
преобразует значения ключа в нижний регистр, поэтому, если вы конвертируете записи конфигурации в словарь, проверьте свои требования. Из-за этого я столкнулся с проблемой. Для меня у меня были ключи от верблюда, поэтому мне пришлось менять код, когда я начал использовать словарь вместо файлов. ConfigParser.get()
метод внутренне преобразует ключ в нижний регистр.
Ответ 7
Предположим, файл: config.properties содержит следующее:
код Python:
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'))
Ответ 8
from 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