El típico archivo generado por ConfigParser se ve así:
[Section]
bar=foo
[Section 2]
bar2= baz
Ahora, ¿hay alguna manera de indexar listas como, por ejemplo:
[Section 3]
barList={
item1,
item2
}
Pregunta relacionada: claves únicas de Python para ConfigParser por sección
python
configparser
pistacho
fuente
fuente
También un poco tarde, pero tal vez útil para algunos. Estoy usando una combinación de ConfigParser y JSON:
solo léelo con:
Incluso puede romper líneas si su lista es larga (gracias @ peter-smit):
Por supuesto, podría usar JSON, pero los archivos de configuración me parecen mucho más legibles, y la sección [POR DEFECTO] es muy útil.
fuente
key5 : [r"abc $x_i$", r"def $y_j$"]
? Ellos plantean el errorjson.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
Llegué tarde a esta fiesta, pero recientemente implementé esto con una sección dedicada en un archivo de configuración para una lista:
y usar
config.items( "paths" )
para obtener una lista iterable de elementos de ruta, así:Espero que esto ayude a otras personas a buscar en Google esta pregunta;)
fuente
; comment
eliminar ciertos elementos de la lista sin tener que volver a escribir la lista completa.key
, ya que ConfigParser convierte todas esas claves en minúsculasconfig = ConfigParser.SafeConfigParser()
config.optionxform = str
Entonces el caso se quedará soloUna cosa que mucha gente no sabe es que se permiten valores de configuración de varias líneas. Por ejemplo:
El valor de
config.get('hello','barlist')
ahora será:Que puedes dividir fácilmente con el método de líneas divisorias (no olvides filtrar los elementos vacíos).
Si observamos un gran marco como Pyramid, están utilizando esta técnica:
Fuente
Yo mismo, tal vez extienda el ConfigParser si esto es algo común para usted:
Tenga en cuenta que hay algunas cosas a tener en cuenta al usar esta técnica
fuente
.splitlines()
lugar de.split()
? Usando el comportamiento predeterminado de cada uno, la división es claramente superior (filtra las líneas en blanco). A menos que me falta algo ...Si quiere pasar literalmente una lista, puede usar:
Por ejemplo, configuración:
El codigo es:
salida:
fuente
ast.literal_eval()
cuando se compara con el uso (posiblemente más popular)json.loads()
? Creo que este último proporciona más seguridad, ¿no?No se menciona el
converters
kwarg paraConfigParser()
en ninguna de estas respuestas fue bastante decepcionante.De acuerdo con la documentación, puede pasar un diccionario al
ConfigParser
que agregará unget
método tanto para el analizador como para los proxies de sección. Entonces para una lista:ejemplo.ini
Ejemplo de analizador:
Este es mi favorito personal ya que no es necesaria una subclasificación y no tengo que depender de un usuario final para escribir perfectamente JSON o una lista que pueda ser interpretada
ast.literal_eval
.fuente
Aterricé aquí buscando consumir esto ...
La respuesta es dividirlo en la coma y quitar los espacios:
Para obtener un resultado de la lista:
Es posible que no responda exactamente la pregunta del OP, pero podría ser la respuesta simple que algunas personas están buscando.
fuente
[email protected]
! ¡No es de extrañar que mi correo siguiera rebotando! > _ <Esto es lo que uso para las listas:
contenido del archivo de configuración:
codigo:
funciona para cuerdas
en caso de números
contenido de configuración:
código:
Gracias.
fuente
Entonces, otra forma, que prefiero, es dividir los valores, por ejemplo:
Podría cargarse así en una lista de cadenas o enteros, de la siguiente manera:
Este método evita que necesite ajustar sus valores entre paréntesis para cargar como JSON.
fuente
Solo los tipos primitivos son compatibles para la serialización mediante el analizador de configuración. Usaría JSON o YAML para ese tipo de requisitos.
fuente
Me enfrenté al mismo problema en el pasado. Si necesita listas más complejas, considere crear su propio analizador heredando de ConfigParser. Entonces sobrescribiría el método get con eso:
Con esta solución también podrá definir diccionarios en su archivo de configuración.
¡Pero ten cuidado! Esto no es tan seguro: esto significa que cualquiera podría ejecutar código a través de su archivo de configuración. Si la seguridad no es un problema en su proyecto, consideraría usar directamente clases de Python como archivos de configuración. Lo siguiente es mucho más poderoso y prescindible que un archivo ConfigParser:
fuente
barList=item1,item2
y luego llamarif value.find(',') > 0: return value.split(',')
, o mejor aún, hacer que la aplicación analice todas las opciones de configuración como listas y solo.split(',')
todo a ciegas?Así que ahora mi
config.cfg
archivo, que podría verse así:Se puede analizar en objetos suficientemente finos para mi pequeño proyecto.
Esto es para un análisis muy rápido de configuraciones simples, pierde toda la capacidad de obtener entradas, bools y otros tipos de salida sin transformar el objeto devuelto
Parser
o volver a hacer el trabajo de análisis realizado por la clase Parser en otro lugar.fuente
Completé una tarea similar en mi proyecto con una sección con claves sin valores:
Salida:
app.config:
fuente
json.loads
Yast.literal_eval
parece estar funcionando, pero una lista simple dentro de la configuración trata a cada carácter como un byte, por lo que devuelve incluso el corchete ...es decir, si config tiene
fieldvalue = [1,2,3,4,5]
luego
config.read(*.cfg)
config['fieldValue'][0]
regresando[
en lugar de1
fuente
Según lo mencionado por Peter Smit ( https://stackoverflow.com/a/11866695/7424596 ) Es posible que desee extender ConfigParser, además, se puede usar un interpolador para convertir automáticamente en y desde la lista.
Como referencia en la parte inferior, puede encontrar el código que convierte automáticamente la configuración como:
Entonces, si solicita claves, obtendrá:
Código:
fuente