2009-11-20 24 views
41

¿Cómo puedo convertir el resultado de una ConfigParser.items ('sección') a un diccionario para dar formato a una cadena como aquí:Convertir ConfigParser.items ('') al diccionario

import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read('conf.ini') 

connection_string = ("dbname='%(dbname)s' user='%(dbuser)s' host='%(host)s' " 
        "password='%(password)s' port='%(port)s'") 

print connection_string % config.items('db') 
+4

Tenga cuidado al usar _sections: esta variable no está documentada, por lo que no se garantiza que funcione en versiones futuras de python – Bertera

+1

Esto es válido para python 2, pero si está utilizando python 3 puede simplemente descomprimir la configuración subscripta en formato(). "su {patrón}". Formato (** config ['db']) – Hovis

Respuesta

47

Esto ya está hecho para usted en config._sections. Ejemplo:

$ cat test.ini 
[First Section] 
var = value 
key = item 

[Second Section] 
othervar = othervalue 
otherkey = otheritem 

Y luego:

>>> from ConfigParser import ConfigParser 
>>> config = ConfigParser() 
>>> config.read('test.ini') 
>>> config._sections 
{'First Section': {'var': 'value', '__name__': 'First Section', 'key': 'item'}, 'Second Section': {'__name__': 'Second Section', 'otherkey': 'otheritem', 'othervar': 'othervalue'}} 
>>> config._sections['First Section'] 
{'var': 'value', '__name__': 'First Section', 'key': 'item'} 

Editar: Mi solución al mismo problema se downvoted así que voy a ilustrar con más detalle la forma en que mi respuesta hace lo mismo sin tener que pasar a la sección a través de dict(), porque config._sections es proporcionado por el módulo para usted ya.

Ejemplo Prueba.ini:

[db] 
dbname = testdb 
dbuser = test_user 
host = localhost 
password = abc123 
port = 3306 

suceso Magic:

>>> config.read('test.ini') 
['test.ini'] 
>>> config._sections 
{'db': {'dbname': 'testdb', 'host': 'localhost', 'dbuser': 'test_user', '__name__': 'db', 'password': 'abc123', 'port': '3306'}} 
>>> connection_string = "dbname='%(dbname)s' user='%(dbuser)s' host='%(host)s' password='%(password)s' port='%(port)s'" 
>>> connection_string % config._sections['db'] 
"dbname='testdb' user='test_user' host='localhost' password='abc123' port='3306'" 

Así que esta solución es no mal, y que en realidad requiere un paso menos. ¡Gracias por pasar!

+0

Esto está mal, ya que no cuenta los valores predeterminados y las variables no se interpolan. –

+1

¿Cómo es esta "forma incorrecta" si da el mismo resultado? – jathanism

+2

No estoy diciendo que sea incorrecto, pero no puedo usar esto, porque lo probé con el analizador de configuración incorporado en reemplazo% (sintaxis) s Para los desconocedores esto permite el uso de valores de configuración en otros valores de configuración. Estos no se expanden en el miembro _sections, sino que son a través de la función items(). – AlwaysTraining

76

Ha intentado

print connection_string % dict(config.items('db')) 

?

+5

Esta debería ser la respuesta aceptada. – johnharris85

+0

derecha. esto funcionó para mí, mientras que el aprobado de alguna manera no ... tal vez es una versión de Python. –

+5

@Ricky, supongo que se supone que el usuario no tiene acceso a _secciones. – Dacav

10

Sé que esto se preguntó hace mucho tiempo y se eligió una solución, pero la solución seleccionada no tiene en cuenta los valores predeterminados y la sustitución de variables. Dado que es el primer golpe al buscar crear dicts a partir de analizadores sintácticos, pensé en publicar mi solución que incluye sustituciones predeterminadas y variables mediante el uso de ConfigParser.items().

from ConfigParser import SafeConfigParser 
defaults = {'kone': 'oneval', 'ktwo': 'twoval'} 
parser = SafeConfigParser(defaults=defaults) 
parser.set('section1', 'kone', 'new-val-one') 
parser.add_section('section1') 
parser.set('section1', 'kone', 'new-val-one') 
parser.get('section1', 'ktwo') 
parser.add_section('section2') 
parser.get('section2', 'kone') 
parser.set('section2', 'kthree', 'threeval') 
parser.items('section2') 
thedict = {} 
for section in parser.sections(): 
    thedict[section] = {} 
    for key, val in parser.items(section): 
     thedict[section][key] = val 
thedict 
{'section2': {'ktwo': 'twoval', 'kthree': 'threeval', 'kone': 'oneval'}, 'section1': {'ktwo': 'twoval', 'kone': 'new-val-one'}} 

Una función de la conveniencia de hacer esto podría ser algo como:

def as_dict(config): 
    """ 
    Converts a ConfigParser object into a dictionary. 

    The resulting dictionary has sections as keys which point to a dict of the 
    sections options as key => value pairs. 
    """ 
    the_dict = {} 
    for section in config.sections(): 
     the_dict[section] = {} 
     for key, val in config.items(section): 
      the_dict[section][key] = val 
    return the_dict 
2

Para una sección individual, por ejemplo, "General", que puede hacer:

dict(parser['general']) 
+0

(Disculpa antes, comentario eliminado. He malinterpretado por completo tu respuesta). – sage

20

¿Cómo lo hice en una sola línea.

my_config_parser_dict = {s:dict(config.items(s)) for s in config.sections()} 

No más de otras respuestas, pero cuando no es los negocios reales de su método y que lo necesitan en un solo lugar utilizar menos líneas y tomar el poder de compresión dict podría ser útil.

Cuestiones relacionadas