Lee todos los contenidos en el archivo ini en el diccionario con Python

Normalmente, el código de la siguiente manera para obtener un elemento en particular en una variable de la siguiente manera

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 

¿Hay alguna manera de leer todos los contenidos en un diccionario de python?

Por ejemplo

 [UNA]
 x = 1
 y = 2
 z = 3
 [SEGUNDO]
 x = 1
 y = 2
 z = 3

está escrito en

 val ["A"] ["x"] = 1
 ...
 val ["B"] ["z"] = 3

Sugiero subclasificar ConfigParser.ConfigParser (o SafeConfigParser , & c) para acceder de forma segura a los atributos “protegidos” (los nombres que comienzan con un solo guión bajo – “privados” serían nombres que comienzan con dos guiones bajos, no se puede acceder incluso en subclases …) :

 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 

Esto emula la lógica habitual de los analizadores de configuración, y se garantiza que funciona en todas las versiones de Python donde hay un módulo ConfigParser.py (hasta 2.7, que es el último de la serie 2.* , sabiendo que no habrá futuro Las versiones de Python 2.any son cómo se puede garantizar la compatibilidad ;-).

Si necesita admitir las futuras versiones de Python 3.* (hasta 3.1 y probablemente la próxima versión 3.2 debería estar bien, simplemente cambiando el nombre del módulo a configparser todo en minúsculas en lugar de eso) puede que necesite atención / ajustes algunos años antes El camino, pero no esperaría nada importante.

Conseguí una respuesta, pero espero que haya una mejor.

 dictionary = {} for section in config.sections(): dictionary[section] = {} for option in config.options(section): dictionary[section][option] = config.get(section, option) 

Los datos de instancia para ConfigParser se almacenan internamente como un dict nested. En lugar de recrearlo, puedes copiarlo.

 >>> 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': } >>> d = p.__dict__['_sections'].copy() >>> d {'A': {'y': '2', '__name__': 'A', 'z': '3', 'x': '1'}, 'B': {'y': '2', '__name__': 'B', 'z': '3', 'x': '1'}} 

Editar:

La solución de Alex Martelli es más limpia, más robusta y más bonita. Si bien esta fue la respuesta aceptada, sugeriría usar su enfoque en su lugar. Ver su comentario a esta solución para más información.

Sé que esta pregunta se hizo hace 5 años, pero hoy he hecho esta comprensión de dictado:

 parser = ConfigParser() parser.read(filename) confdict = {section: dict(parser.items(section)) for section in parser.sections()} 

¿Cómo analizar el archivo ini en py?

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

Donde el archivo test.ini contiene:

 [DEFAULT] network=shutup others=talk 

Una cosa más a tener en cuenta es que ConfigParser convierte los valores clave en minúsculas, por lo tanto, en caso de que esté convirtiendo las entradas de configuración en un diccionario, verifique sus requisitos. Me enfrenté a un problema debido a esto. Para mí, tenía llaves de caja de camello, por lo tanto, tuve que cambiar cierta cantidad de código cuando empecé a usar el diccionario en lugar de los archivos. ConfigParser.get() método ConfigParser.get() convierte internamente la clave a minúsculas.

de 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