write read files python configuration-files python-2.x configparser

python - read - ¿Conservar caso en ConfigParser?



python configparser read (5)

He intentado usar el módulo ConfigParser de Python para guardar la configuración. Para mi aplicación es importante que conserve el caso de cada nombre en mis secciones. Los documentos mencionan que pasar str () a ConfigParser.optionxform() lograría esto, pero no funciona para mí. Los nombres son todos en minúscula. ¿Me estoy perdiendo de algo?

<~/.myrc contents> [rules] Monkey = foo Ferret = baz

Python pseudocódigo de lo que obtengo:

import ConfigParser,os def get_config(): config = ConfigParser.ConfigParser() config.optionxform(str()) try: config.read(os.path.expanduser(''~/.myrc'')) return config except Exception, e: log.error(e) c = get_config() print c.options(''rules'') [(''monkey'', ''foo''), (''ferret'', ''baz'')]


Advertencia:

Si usa valores predeterminados con ConfigParser, es decir:

config = ConfigParser.SafeConfigParser({''FOO_BAZ'': ''bar''})

y luego intente hacer que el analizador distinga entre mayúsculas y minúsculas usando esto:

config.optionxform = str

todas sus opciones de archivos de configuración mantendrán su caso, pero FOO_BAZ se convertirá a minúsculas.

Para que los valores predeterminados también mantengan su caso, use subclases como en la respuesta @icedtrees:

class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({''FOO_BAZ'': ''bar''})

Ahora FOO_BAZ mantendrá su caso y usted no tendrá InterpolationMissingOptionError .


Agregue a su código:

config.optionxform = lambda option: option # preserve case for letters


La documentación es confusa. Lo que quieren decir es esto:

import ConfigParser, os def get_config(): config = ConfigParser.ConfigParser() config.optionxform=str try: config.read(os.path.expanduser(''~/.myrc'')) return config except Exception, e: log.error(e) c = get_config() print c.options(''rules'')

Es decir, anular optionxform, en lugar de llamarlo; La anulación se puede hacer en una subclase o en la instancia. Al anular, configúrelo en una función (en lugar del resultado de llamar a una función).

Ahora he reportado esto como un error , y desde entonces ha sido corregido.


Para mí, trabajé para configurar optionxform inmediatamente después de crear el objeto.

config = ConfigParser.RawConfigParser() config.optionxform = str


Sé que esta pregunta está respondida, pero pensé que algunas personas podrían encontrar útil esta solución. Esta es una clase que puede reemplazar fácilmente la clase ConfigParser existente.

Editado para incorporar la sugerencia de @ OozeMeister:

class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr

El uso es el mismo que el ConfigParser normal.

parser = CaseConfigParser() parser.read(something)

Esto es para evitar tener que configurar optionxform cada vez que ConfigParser un ConfigParser nuevo, lo cual es un poco tedioso.