Pregunta

Tengo un problema. Mi programa está utilizando el archivo de configuración de opciones de configuración, y una de esas opciones es una tupla. Esto es lo que quiero decir:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/

etc ... Puedo analizar esto en tupla con el módulo ConfigParser en Python? ¿Hay alguna forma fácil de hacer esto?

¿Fue útil?

Solución

si se puede cambiar el formato de configuración de la siguiente manera:

folder = /home/scorpil
         /media/sda5/
         /media/sdb5/

entonces en Python:

config.get("common", "folder").split("\n")

Otros consejos

Su configuración podría ser:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder = ("/home/scorpil", "/media/sda5/", "/media/sdb5/")

Si se asume que usted tiene de configuración en un archivo llamado foo.cfg, puede hacer lo siguiente:

import ConfigParser
cp = ConfigParser.ConfigParser()
cp.read("foo.cfg")
folder = eval(cp.get("common", "folder"), {}, {})

print folder
print type(folder)

que debe producir:

  

( '/ home / scorpil', '/ media / sda5 /', '/ media / sdb5 /')
  

- EDITAR - ya que he cambiado de opinión sobre esto, y tomaría la posición hoy que el uso de eval en este contexto es una mala idea. Incluso con un entorno restringido, si el archivo de configuración se encuentra bajo el control del usuario puede ser una muy mala idea. Hoy en día probablemente me recomiendan hacer algo interesante con división para evitar la ejecución de código malicioso.

Usted puede obtener la lista de elementos y el uso de una lista por comprensión para crear una lista de todos los artículos que se inicia con un prefijo de nombre definido, en su caso carpeta

folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])

Crea configuración:

folders = ['/home/scorpil', '/media/sda5/', '/media/sdb5/']
config.set('common', 'folders', json.dumps(folders))

configuración de carga:

tuple(json.loads(config.get('common', 'folders')))

No sé ConfigParser, pero se puede leer fácilmente en una lista (tal vez usando .append()) y luego hacer myTuple = tuple(myList)

#!/usr/bin/env python
sample = """
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/
"""
from cStringIO import StringIO
import ConfigParser
import re
FOLDER_MATCH = re.compile(r"folder\[(\d+)\]$").match

def read_list(items,pmatch=FOLDER_MATCH):
    if not hasattr(pmatch,"__call__"):
        pmatch = re.compile(pmatch).match
    folder_list = []
    for k,v in items:
        m = pmatch(k)
        if m:
            folder_list.append((int(m.group(1)),v))
    return tuple( kv[1] for kv in sorted(folder_list) )


if __name__ == '__main__':
    cp = ConfigParser.SafeConfigParser()
    cp.readfp(StringIO(sample),"sample")

    print read_list(cp.items("common"))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top