resueltos recorrer lista elementos ejercicios diccionarios diccionario dentro convertir agregar python configuration-files ini

recorrer - lista de diccionarios python



Lee todos los contenidos en el archivo ini en el diccionario con Python (7)

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 forma de leer todos los contenidos en un diccionario de python?

Por ejemplo

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

está escrito en

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


¿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


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 de ConfigParser se almacenan internamente como un dict anidado. 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'': <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''}}

Editar:

La solution 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()}


Sugiero subclasificar ConfigParser.ConfigParser (o SafeConfigParser , & c) para acceder de forma segura a los atributos "protegidos" (los nombres que comienzan con un guión bajo - "privado" 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 vez de eso) puede necesitar atención / ajustes algunos años antes El camino, pero no esperaría nada importante.


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