Después de de una larga compilación de datos hemos podido solucionar esta contratiempo que presentan algunos lectores. Te regalamos la solución y deseamos que sea de mucha ayuda.
Solución:
Para un archivo de configuración sin encabezados de sección, rodeado por []
– encontrarás el ConfigParser.NoSectionError
se lanza una excepción. Hay soluciones para esto insertando un encabezado de sección ‘falso’, como se demuestra en esta respuesta.
En el caso de que el archivo sea simple, como se menciona en la respuesta de pcalcao, puede realizar algunas string manipulación para extraer los valores.
Aquí hay un fragmento de código que devuelve un diccionario de key-valores pares para cada uno de los elementos en su archivo de configuración.
separator = "="
keys =
# I named your file conf and stored it
# in the same directory as the script
with open('conf') as f:
for line in f:
if separator in line:
# Find the name and value by splitting the string
name, value = line.split(separator, 1)
# Assign key value pair to dict
# strip() removes white space from the ends of strings
keys[name.strip()] = value.strip()
print(keys)
Me gusta la respuesta actual. Y … siento que hay una forma más limpia de hacerlo en el “mundo real”. El uso de la función de encabezado de sección es OBLIGATORIO si está realizando un proyecto de cualquier tamaño o escala, particularmente en el ámbito de entornos “múltiples”. Quería ponerlo aquí con un código copiable bien formateado, usando un ejemplo robusto del mundo real. Esto se ejecuta en Ubuntu 14, pero funciona multiplataforma:
Ejemplo simple del mundo real
Una configuración ‘basada en el entorno’
Ejemplo de configuración (terminal):
cd ~ / my / cool / project touch local.properties touch environment.properties ls -la ~ / my / cool / project -rwx —— 1 www-data www-data 0 24 de enero 23:37 local.properties -rwx —— 1 www-data www-data 0 24 de enero 23:37 environment.properties
Establecer buenos permisos
>> chmod 644 local.properties
>> chmod 644 env.properties
>> ls -la
-rwxr--r-- 1 www-data www-data 0 Jan 24 23:37 local.properties
-rwxr--r-- 1 www-data www-data 0 Jan 24 23:37 environ.properties
Edite sus archivos de propiedades.
ARCHIVO 1: local.properties
Este es SU archivo de propiedades, local para su máquina y espacio de trabajo, y contiene datos confidenciales, ¡no presione el control de versiones!
[global]
relPath=local/path/to/images
filefilters=(.jpg)|(.png)
[dev.mysql]
dbPwd=localpwd
dbUser=localrootuser
[prod.mysql]
[email protected]#
dbUser=serverRootUser
[branch]
# change this to point the script at a specific environment
env=dev
ARCHIVO 2: Environment.properties
Este archivo de propiedades es compartido por todos, los cambios se envían al control de versiones
#----------------------------------------------------
# Dev Environment
#----------------------------------------------------
[dev.mysql]
dbUrl=localhost
dbName=db
[dev.ftp]
site=localhost
uploaddir=http://localhost/www/public/images
[dev.cdn]
url=http://localhost/cdn/www/images
#----------------------------------------------------
# Prod Environment
#----------------------------------------------------
[prod.mysql]
dbUrl=http://yoursite.com:80
dbName=db
[prod.ftp]
site=ftp.yoursite.com:22
uploaddir=/www/public/
[prod.cdn]
url=http://s3.amazon.com/your/images/
Archivo Python: readCfg.py
Este script es un fragmento reutilizable para cargar una lista de archivos de configuración.
importar ConfigParser importar sistema operativo
# a simple function to read an array of configuration files into a config object
def read_config(cfg_files):
if(cfg_files != None):
config = ConfigParser.RawConfigParser()
# merges all files into a single config
for i, cfg_file in enumerate(cfg_files):
if(os.path.exists(cfg_file)):
config.read(cfg_file)
return config
Archivo Python: yourCoolProgram.py
Este programa importará el archivo anterior y llamará al método ‘read_config’
from readCfg import read_config
#merge all into one config dictionary
config = read_config(['local.properties', 'environ.properties'])
if(config == None):
return
# get the current branch (from local.properties)
env = config.get('branch','env')
# proceed to point everything at the 'branched' resources
dbUrl = config.get(env+'.mysql','dbUrl')
dbUser = config.get(env+'.mysql','dbUser')
dbPwd = config.get(env+'.mysql','dbPwd')
dbName = config.get(env+'.mysql','dbName')
# global values
relPath = config.get('global','relPath')
filefilterList = config.get('global','filefilters').split('|')
print "files are: ", fileFilterList, "relative dir is: ", relPath
print "branch is: ", env, " sensitive data: ", dbUser, dbPwd
Conclusión
Dada la configuración anterior, ahora puede tener un script que cambia completamente los entornos cambiando el [branch]valor env en ‘propiedades locales’. ¡Y todo esto se basa en buenos principios de configuración! ¡Yaay!
Si necesita leer todos los valores de una sección en el archivo de propiedades de una manera simple:
Tu config.properties
diseño de archivo:
[SECTION_NAME]
key1 = value1
key2 = value2
Tu codificas:
import configparser
config = configparser.RawConfigParser()
config.read('path_to_config.properties file')
details_dict = dict(config.items('SECTION_NAME'))
Esto le dará un diccionario donde keys son los mismos que en el archivo de configuración y sus valores correspondientes.
details_dict
es :
'key1':'value1', 'key2':'value2'
Ahora para obtener el valor de key1:
details_dict['key1']
Ponerlo todo en un método que lee esa sección del archivo de configuración solo una vez (la primera vez que se llama al método durante la ejecución de un programa).
def get_config_dict():
if not hasattr(get_config_dict, 'config_dict'):
get_config_dict.config_dict = dict(config.items('SECTION_NAME'))
return get_config_dict.config_dict
Ahora llame a la función anterior y obtenga la requerida keyvalor de:
config_details = get_config_dict()
key_1_value = config_details['key1']
————————————————– ———–
Extendiendo el enfoque mencionado anteriormente, leyendo sección por sección automáticamente y luego accediendo por nombre de sección seguido de key nombre.
def get_config_section():
if not hasattr(get_config_section, 'section_dict'):
get_config_section.section_dict = dict()
for section in config.sections():
get_config_section.section_dict[section] =
dict(config.items(section))
return get_config_section.section_dict
Acceder:
config_dict = get_config_section()
port = config_dict['DB']['port']
(aquí ‘DB’ es un nombre de sección en el archivo de configuración y ‘puerto’ es un key en la sección ‘DB’.)