2009-08-21 9 views
8

Al utilizar el módulo ConfigParser, me gustaría utilizar valores que contengan varias palabras establecidas en el archivo cfg. En este caso parece trivial para mí para rodear la cadena con citas como (example.cfg):Python ConfigParser - valores entre comillas

[GENERAL] 
onekey = "value in some words" 

Mi problema es que en este caso pitón añade las cotizaciones a la cadena, así cuando se utiliza el valor de la siguiente manera:

config = ConfigParser() 
config.read(["example.cfg"]) 
print config.get('GENERAL', 'onekey') 

Estoy seguro de que existe una función incorporada para lograr imprimir solo 'value in some words' en lugar de '"value in some words"'. ¿Como es posible? Gracias.

Respuesta

9

No vi nada en the configparser manual, pero podría usar el método de cadenas .strip para deshacerse de las comillas dobles iniciales y finales.

>>> s = '"hello world"' 
>>> s 
'"hello world"' 
>>> s.strip('"') 
'hello world' 
>>> s2 = "foo" 
>>> s2.strip('"') 
'foo' 

Como se puede ver, .strip no modifica la cadena si no se inicia y termina con la cadena especificada.

+0

Nota la última frase debe ser actualizada. 'strip()' SES modifica la cadena si comienza O termina con la cadena especificada. p.ej. ''" bar'.strip ("'") 'devuelve''bar' y no 'bar'. – Jonny

2

Disculpa, la solución también fue trivial: simplemente puedo dejar las comillas, parece que python simplemente toma el lado derecho del signo igual.

0

Davey,

Como usted dice que sólo puede salir de las cotizaciones fuera de su cadena.

Para un proyecto en el que estoy trabajando Quería poder representar casi cualquier literal de cadena de Python como valor para algunas de mis opciones de configuración y más al punto que quería poder manejar algunas de ellas como raw literales de cadena. (Quiero que esa configuración sea capaz de manejar cosas como \ n, \ x1b, etc.).

En ese caso he usado algo como:

def EvalStr(s, raw=False): 
    r'''Attempt to evaluate a value as a Python string literal or 
     return s unchanged. 

     Attempts are made to wrap the value in one, then the 
     form of triple quote. If the target contains both forms 
     of triple quote, we'll just punt and return the original 
     argument unmodified. 

     Examples: (But note that this docstring is raw!) 
     >>> EvalStr(r'this\t is a test\n and only a \x5c test') 
     'this\t is a test\n and only a \\ test' 

     >>> EvalStr(r'this\t is a test\n and only a \x5c test', 'raw') 
     'this\\t is a test\\n and only a \\x5c test' 
    ''' 

    results = s ## Default returns s unchanged 
    if raw: 
     tmplate1 = 'r"""%s"""' 
     tmplate2 = "r'''%s'''" 
    else: 
     tmplate1 = '"""%s"""' 
     tmplate2 = "'''%s'''" 

    try: 
     results = eval(tmplate1 % s) 
    except SyntaxError: 
    try: 
     results = eval(tmplate2 %s) 
    except SyntaxError: 
     pass 
    return results 

... que creo que va a manejar cualquier cosa que no contiene ambas cadenas de triples y triples-dobles comillas.

(Esa funda de esquina es mucho más allá de mis requisitos).

Hay una rareza de este código aquí en SO; el resaltador de sintaxis parece confundirse por , el hecho de que mi docstring es una cadena sin formato. Eso fue necesario para hacer feliz a esta función particular).

5
import ConfigParser 

class MyConfigParser(ConfigParser.RawConfigParser): 
    def get(self, section, option): 
     val = ConfigParser.RawConfigParser.get(self, section, option) 
     return val.strip('"') 

if __name__ == "__main__": 
    #config = ConfigParser.RawConfigParser() 
    config = MyConfigParser() 

    config.read(["example.cfg"]) 
    print config.get('GENERAL', 'onekey') 
2

La pregunta ya es bastante antigua, pero en 2.6 al menos no es necesario utilizar comillas porque los espacios se conservan.

from ConfigParser import RawConfigParser 
from StringIO import StringIO 

s = RawConfigParser() 
s.readfp(StringIO('[t]\na= 1 2 3')) 
s.get('t','a') 
> '1 2 3' 

¡Eso no se aplica a los espacios iniciales o finales! Si desea conservarlos, deberá adjuntarlos entre comillas y proceder como se sugiere. Abstenerse de utilizar la palabra clave eval, ya que tendrá un gran agujero de seguridad.

-2

En esta situación, la solución más simple es "eval()".

Sin embargo, puede que le preocupen las cuestiones de seguridad.Pero todavía se puede hacer esto:

def literal_eval(node_or_string): 
    """ 
    Safely evaluate an expression node or a string containing a Python 
    expression. The string or node provided may only consist of the following 
    Python literal structures: strings, numbers, tuples, lists, dicts,booleans, 
    and None. 
    """ 

como muestra:

import ast 
config = ConfigParser() 
config.read(["example.cfg"]) 
print ast.literal_eval(config.get('GENERAL', 'onekey')) 
# value in some words 
Cuestiones relacionadas