2010-08-27 14 views
6

¿Cómo puedo analizar las etiquetas sin valor en un archivo ini con el módulo de configuración de python?¿Cómo manejar valores vacíos en archivos de configuración con ConfigParser?

Por ejemplo, tengo la siguiente ini y necesito analizar rb. En algunos archivos ini, rb tiene valores enteros y algunos no tienen ningún valor, como el ejemplo siguiente. ¿Cómo puedo hacer eso con configparser sin obtener un valueerror? Yo uso la función getint

[section] 
person=name 
id=000 
rb= 
+4

Por favor, use la puntuación. – Seth

Respuesta

6

uso pueden ser un bloque try...except:

try: 
     value=parser.getint(section,option) 
    except ValueError: 
     value=parser.get(section,option) 

Por ejemplo:

import ConfigParser 

filename='config' 
parser=ConfigParser.SafeConfigParser() 
parser.read([filename]) 
print(parser.sections()) 
# ['section'] 
for section in parser.sections(): 
    print(parser.options(section)) 
    # ['id', 'rb', 'person'] 
    for option in parser.options(section): 
     try: 
      value=parser.getint(section,option) 
     except ValueError: 
      value=parser.get(section,option) 
     print(option,value,type(value)) 
     # ('id', 0, <type 'int'>) 
     # ('rb', '', <type 'str'>) 
     # ('person', 'name', <type 'str'>) 
print(parser.items('section')) 
# [('id', '000'), ('rb', ''), ('person', 'name')] 
+0

Es ConfigParser.NoOptionError en mi versión de python. –

11

Es necesario establecer allow_no_value=True argumento opcional al crear el objeto analizador.

+0

He intentado utilizar config = ConfigParser.ConfigParser (allow_no_value = True) config.read (InfFile) pero me sale este error TypeError: __init __() tiene un argumento inesperado palabra clave 'allow_no_value – AKM

+3

Parece que [argumento] (http://docs.python.org/library/configparser.html#ConfigParser.RawConfigParser) solo se agregó en Python 2.7. – Santa

+2

Luego, la pregunta es cómo manejar el valor vacío con ConfigParser para 2.6. – Exploring

3

En lugar de utilizar getint(), utilice get() para obtener la opción como una cadena. A continuación, convertir a un int a sí mismo:

rb = parser.get("section", "rb") 
if rb: 
    rb = int(rb) 
0

Dado que todavía hay una pregunta sin respuesta sobre Python 2.6, el siguiente trabajo con Python 2.7 o 2.6. Esto reemplaza la expresión regular interna utilizada para analizar la opción, el separador y el valor en ConfigParser.

def rawConfigParserAllowNoValue(config): 
    '''This is a hack to support python 2.6. ConfigParser provides the 
    option allow_no_value=True to do this, but python 2.6 doesn't have it. 
    ''' 
    OPTCRE_NV = re.compile(
     r'(?P<option>[^:=\s][^:=]*)' # match "option" that doesn't start with white space 
     r'\s*'       # match optional white space 
     r'(?P<vi>(?:[:=]|\s*(?=$)))\s*' # match separator ("vi") (or white space if followed by end of string) 
     r'(?P<value>.*)$'    # match possibly empty "value" and end of string 
    ) 
    config.OPTCRE = OPTCRE_NV 
    config._optcre = OPTCRE_NV 
    return config 

uso como

fp = open("myFile.conf") 
    config = ConfigParser.RawConfigParser() 
    config = rawConfigParserAllowNoValue(config) 

Nota al margen

Hay una OPTCRE_NV en ConfigParser para Python 2.7, pero si lo usamos en la función anterior exactamente, la expresión regular devolvería None para vi y value, que hace que ConfigParser falle internamente. El uso de la función anterior arroja una cadena en blanco para vi y valor y todos están contentos.

Cuestiones relacionadas