2012-07-09 20 views
7

que tienen un archivo de configuración utilizando configParser:¿Nuevas líneas con ConfigParser?

<br> 
[ section one ]<br> 
one = Y,Z,X <br><br> 
[EG 2]<br> 
ias = X,Y,Z<br> 

Mi programa funciona bien la lectura y procesamiento de estos valores.

Sin embargo, algunas de las secciones van a ser bastante grandes. Necesito un archivo de configuración que permiten que los valores sean en una nueva línea, así:

[EG SECTION]<br> 
EG=<br> 
item 1 <br> 
item 2 <br> 
item 3<br> 
etc... 

En mi código que tienen una función simple que toma un delimitador (o separador) de los valores utilizando string.split() obviamente ahora establecer en coma He intentado con la cadena de escape \n que no funciona.

¿Alguien sabe si esto es posible con el analizador de configuración de python?
http://docs.python.org/library/configparser.html

# We need to extract data from the config 
def getFromConfig(currentTeam, section, value, delimeter): 
    cp = ConfigParser.ConfigParser() 
    fileName = getFileName(currentTeam) 
    cp.read(fileName) 
    try: 
     returnedString = cp.get(section, value) 
    except: # The config file could be corrupted 
     print("Error reading " + fileName + " configuration file.") 
     sys.exit(1) #Stop us from crashing later 
    if delimeter != "": # We may not need to split 
     returnedList = returnedString.split(delimeter) 
    return returnedList 

me gustaría utilizar para esto:

taskStrings = list(getFromConfig(teamName, "Y","Z",",")) 

Respuesta

10

docstring El ConfigParser _read() del método dice:

continuaciones están representados por una nueva línea que lleva incrustado a continuación, los espacios en blanco.

O, alternativamente (como la versión en Python 3 pone):

Los valores pueden abarcar varias líneas, siempre y cuando se sangran más profunda que la primera línea del valor.

Esta característica proporciona un medio para dividir los valores y "continuarlos" en múltiples líneas. Por ejemplo, por lo que tuvo un archivo de configuración llamado 'test.ini' que contenía:

[EG SECTION]<br> 
EG=<br> 
    item 1<br> 
    item 2<br> 
    item 3<br> 

Se podía leer el valor de EG en el EG SECTION en una lista con el código como el siguiente:

try: 
    import ConfigParser as configparser 
except ImportError: # Python 3 
    import configparser 

cp = configparser.ConfigParser() 
cp.read('test.ini') 

eg = cp.get('EG SECTION', 'EG') 
print(repr(eg)) # -> '\nitem 1\nitem 2\nitem 3' 

cleaned = [item for item in eg.strip().split('\n')] 
print(cleaned) # -> ['item 1', 'item 2', 'item 3'] 
+0

¿Es posible algún nivel de anidación? Por ejemplo, supongamos que tengo una sección prevista en la que uno de los valores vuelve a ser secundario. ¡De nuevo, esto tiene un valor que es secundario y demás! – Nishant

+1

@Nishant: suponiendo que se refiera a "sangrado": en primer lugar, podría responder fácilmente la pregunta usted mismo (intentándolo, si nada más).Sin embargo, para ahorrarte el problema, no importa la cantidad de elementos sangrados, ya sea que lo estén o no. – martineau

+0

Me refiero a sanción lo siento. Obtuve la parte que podría sangrar a cualquier profundidad, pero lo que quise decir es ¿qué pasa si hay un elemento adicional en ese material * profundamente * con sangría que tiene * elementos profundamente sangrados *? Me refiero al caso habitual de anidación. Supongo que el tercer nivel en este caso. Espero que lo entiendas, de lo contrario está bien :-) Lo probaré y probablemente publique otra pregunta. – Nishant

2

Parece posible. En mi propio archivo de configuración, por ejemplo, tengo un objeto de lista de tuplas:

[root] 
path:/
redirectlist: [ (r'^magic', '/file'), 
    (r'^avplay', '/file'), 
    (r'^IPTV', '/file'), 
    (r'^box', '/file'), 
    (r'^QAM', '/qam'), 
    (r'.*opentv.*', '/qam'), 
    (r'.+', '/file') ] 

y hago:

redirectstr = _configdict.get('root', 'redirectlist') 
redirects = eval(redirectstr) 

nota que estoy realmente eval'ing esa línea, lo que puede causar la seguridad infracciones si se usa en la naturaleza.

+6

Parece que podría hacer esto de forma segura simplemente reemplazando 'eval' con' ast.literal_eval', a menos que esté permitiendo que el usuario ingrese objetos que no son simples objetos de pitón (diccionarios, cadenas, listas, tuplas, flotantes y enteros). – mgilson

Cuestiones relacionadas