Pitón

Cómo leer y escribir archivos INI y Conf usando Python

Cómo leer y escribir archivos INI y Conf usando Python
El lenguaje de programación Python viene con un útil módulo incorporado llamado "ConfigParser" que se puede usar para escribir claramente los parámetros de configuración de las aplicaciones. ConfigParser utiliza un lenguaje de configuración bien definido y estructurado totalmente compatible con los archivos INI que se encuentran en Microsoft Windows. Estos archivos INI también se pueden usar con aplicaciones de Python que se ejecutan en Linux y brindan una forma persistente de almacenar y recuperar valores.

En Linux, es más común ver ".conf "archivos que".archivos ini ”. Los archivos conf en Linux son como cualquier otro archivo de texto y, por lo tanto, se pueden estructurar de cualquier manera. Depende del analizador cómo interpreta un ".conf "archivo. El módulo ConfigParser de Python puede analizar ".conf ”también (o cualquier otra extensión aleatoria), siempre que estos archivos estén definidos en un lenguaje de configuración compatible con INI. Este artículo explicará la lectura y la escritura ".conf ”en Linux con la última versión estable de Python 3. Tenga en cuenta que si reemplaza todas las apariciones de ".conf "en este artículo con".ini ”, el resultado sería el mismo. El proceso y el código que se explica a continuación también deberían ser compatibles en su mayoría con Microsoft Windows, con algunas diferencias menores. Aunque estas diferencias no se cubrirán en este artículo.

Módulo ConfigParser

El analizador de archivos de configuración o ConfigParser es un módulo de Python que le permite leer y escribir archivos de configuración utilizados en aplicaciones de Python. Como se explicó anteriormente, este módulo admite la sintaxis de archivos INI. Un muy simplista ".ini ”/“.conf ”el archivo se ve así.

[DEFECTO]
sonido = 1
música = 1
volumen = 0.8
resolución = 1920x1080
[Usuario]
# el sonido puede tener 0 (falso) y 1 (verdadero) como valores posibles
sonido = 1
; la música puede tener 0 (falso) y 1 (verdadero) como valores posibles
música = 0
Volumen = 0.4
resolución = 1280x720

El ejemplo ".conf ”anterior tiene dos secciones,“ DEFAULT ”y“ User ”. Por lo general, los programas de Python se codifican de tal manera que los valores de la sección DEFAULT nunca se cambian. La sección DEFAULT se utiliza para restablecer los valores generales o individuales a los valores predeterminados. La sección de usuario refleja los cambios realizados por un usuario final que está utilizando el programa Python. Tenga en cuenta que los nombres de las secciones pueden ser cualquier cosa y no es necesario tener una sección PREDETERMINADA en absoluto. Sin embargo, siempre que esté presente la sección "DEFAULT" (el nombre debe estar en mayúsculas), se utilizará para proporcionar valores predeterminados de forma segura si ConfigParser no puede analizar ciertas variables. La lógica para manejar estas secciones, las variables debajo de ellas y los valores de respaldo deben definirse en el propio programa Python. Símbolos como "#" y ";" se puede utilizar para indicar comentarios en ".conf ”archivos. Todos los pares clave-valor en el archivo de configuración no distinguen entre mayúsculas y minúsculas, generalmente escritos en minúsculas.

Manejo de tipos de datos por ConfigParser

Antes de continuar con algunos ejemplos de ConfigParser, es importante comprender los tipos de datos que maneja este módulo. Para ConfigParser, cada fragmento de código escrito o analizado es una cadena. No puede diferenciar entre números o cualquier otro formato. Los programadores necesitan escribir lógica en su programa para convertir una cadena "1234" en un número utilizando int ("1234") mientras leen datos de una ".conf "archivo.

Si bien la conversión a números usando el método int y float es una tarea bastante fácil, convertir a booleano puede ser complicado ya que Python considera que bool ("any_string") es True. Para superar este problema, puede usar declaraciones condicionales que verifiquen una cadena específica. El módulo ConfigParser también proporciona un método llamado "getboolean ()". Este método puede diferenciar correctamente los valores booleanos 'sí' / 'no', 'activado' / 'desactivado', 'verdadero' / 'falso' y '1' / '0' incluso si son cadenas. ConfigParser también incluye métodos getint () y getfloat () para su conveniencia.

Escribir y guardar un nuevo archivo Conf mediante ConfigParser

Asumamos el ".conf ”mencionado anteriormente no existe y desea crearlo automáticamente en el primer lanzamiento del programa. El siguiente código creará una nueva "configuración.conf ”en el directorio desde el que se ejecutó el programa Python.

importar configparser
config = configparser.ConfigParser ()
config ['DEFAULT'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
config ['Usuario'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
con abrir ('configuración.conf ',' w ') como archivo de configuración:
config.escribir (archivo de configuración)

La primera declaración en el código anterior importa el módulo ConfigParser. La segunda declaración crea un objeto similar a un diccionario llamado "config". Ahora puede usar la sintaxis estándar del diccionario de Python para definir secciones y variables incluidas debajo de ellas, como se evidencia en las siguientes dos declaraciones. Por último, la declaración "con abierto" crea una nueva "configuración.conf ”y escribe secciones de configuración en el archivo.

El código anterior funciona, pero hay un pequeño problema con él. Crea un nuevo archivo de configuración cada vez que se ejecuta el programa, lo que resulta en la sobrescritura de las ediciones realizadas por el usuario en el archivo de configuración. Para solucionar este problema, debe verificar dos condiciones:

El código modificado a continuación verificará las dos condiciones y solo creará un nuevo archivo de configuración si se cumplen estas dos condiciones.

importar configparser
importar sistema operativo
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
config ['Usuario'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
settings_file = os.camino.dirname (os.camino.realpath (__ archivo__))
+ os.sep + "configuración.conf "
si no os.camino.existe (archivo_configuración)
o os.stat (archivo_configuración).st_size == 0:
con abrir ('configuración.conf ',' w ') como archivo de configuración:
config.escribir (archivo de configuración)

La segunda declaración en el código anterior importa el módulo "os". La variable "settings_file" almacena la ruta completa a la "configuración.conf ”que se creará en el directorio de la secuencia de comandos de Python. La siguiente declaración verifica dos condiciones mencionadas anteriormente. La primera cláusula de la declaración se explica por sí misma. La segunda cláusula verifica si el tamaño del archivo es "0 bytes". Un archivo de cero bytes significaría un archivo vacío sin datos almacenados en él. El resto del código es el mismo que el del primer ejemplo mencionado anteriormente.

Hasta ahora, los ejemplos de código explicados anteriormente guardan el archivo de configuración en el directorio del script de Python. Sin embargo, es una práctica común y estándar freedesktop guardar los archivos de configuración en el ".config ”en la carpeta de inicio. El ejemplo de código a continuación creará una nueva "configuración.conf ”archivo en“ ~ /.carpeta config / testapp ”.

importar configparser
importar sistema operativo
 
app_name = "testapp"
config_folder = os.camino.unirse (os.camino.expanduser ("~"), '.config ', nombre_aplicación)
os.makedirs (config_folder, exist_ok = True)
settings_file = "configuración.conf "
full_config_file_path = os.camino.unirse (carpeta_configuración, archivo_configuración)
 
config = configparser.ConfigParser ()
config ['DEFAULT'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
config ['Usuario'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
 
si no os.camino.existe (ruta_archivo_configuración_completa)
u os.stat (ruta_archivo_config_completa).st_size == 0:
con open (full_config_file_path, 'w') como archivo de configuración:
config.escribir (archivo de configuración)

El código anterior es casi el mismo que el del ejemplo anterior, excepto que cambia la ubicación de "configuración.conf "archivo a" ~ /.config / testapp / settings.conf ". La variable "config_folder" almacena la ruta completa a la carpeta de la aplicación que se creará en ".config ”directorio (“ ~ /.config / testapp / ”). El "os.makedirs ”solo creará una nueva carpeta de aplicaciones si aún no existe. La variable "full_config_file_path" almacena la ruta completa del archivo de configuración ("~ /.config / testapp / settings.conf ”). El resto del código se explica por sí mismo.

Leer un archivo Conf con ConfigParser

Analizar un archivo de configuración es bastante sencillo. ConfigParser intenta leer un valor utilizando los métodos get (), getfloat (), getboolean () o la sintaxis del diccionario. En caso de un error de clave, se utilizan valores de la sección DEFAULT o valores alternativos. Es una buena práctica definir la sección DEFAULT o los valores de respaldo para evitar errores de clave. También puede usar declaraciones try-except para suprimir errores.

config = configparser.ConfigParser ()
config.leer (ruta_archivo_configuración_completa)
 
is_sound_on = config ['Usuario'].getboolean ('sonido')
volume_level = config ['Usuario'].getfloat ('volumen')
resolución = config ['Usuario'] ['resolución']
 
# El valor de reserva "False" se ignorará porque ya existe una sección DEFAULT.
# En ausencia de la sección DEFAULT, el valor de reserva se utilizará debidamente.
is_music_on = config ['Usuario'].getboolean ('música', falso)
 
imprimir (is_sound_on, is_music_on, volume_level, resolución)

En el ejemplo de código anterior, "config.leer "declaración se utiliza para leer datos de un archivo de configuración. En las siguientes declaraciones, se utilizan varios métodos de obtención incorporados y notaciones de diccionario para leer los datos. En la declaración de la variable "is_music_on", el segundo argumento es el valor de respaldo (Falso). Tenga en cuenta que los valores de reserva tendrán una precedencia menor que los valores definidos en la sección DEFAULT. En términos simples, los valores de respaldo no tendrán ningún efecto cuando un par clave-valor ya esté presente en la sección DEFAULT.

Código completo

A continuación se muestra el código completo que combina la creación de la primera ejecución del archivo de configuración y la lectura del archivo de configuración.

#! / usr / bin / python3
importar configparser
importar sistema operativo
 
app_name = "testapp"
config_folder = os.camino.unirse (os.camino.expanduser ("~"), '.config ', nombre_aplicación)
os.makedirs (config_folder, exist_ok = True)
settings_file = "configuración.conf "
full_config_file_path = os.camino.unirse (carpeta_configuración, archivo_configuración)
 
config = configparser.ConfigParser ()
 
config ['DEFAULT'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
config ['Usuario'] = "sonido": "1", "música": "1",
"volumen": "0.8 "," resolución ":" 1920 x 1080 "
 
si no os.camino.existe (ruta_archivo_configuración_completa)
u os.stat (ruta_archivo_config_completa).st_size == 0:
con open (full_config_file_path, 'w') como archivo de configuración:
config.escribir (archivo de configuración)
 
config.leer (ruta_archivo_configuración_completa)
is_sound_on = config ['Usuario'].getboolean ('sonido')
volume_level = config ['Usuario'].getfloat ('volumen')
resolución = config ['Usuario'] ['resolución']
 
# El valor de reserva "Falso" se ignorará porque ya existe una sección DEFAULT.
# En ausencia de la sección DEFAULT, el valor de reserva se utilizará debidamente.
is_music_on = config ['Usuario'].getboolean ('música', falso)
 
imprimir (is_sound_on, is_music_on, volume_level, resolución)

Conclusión

ConfigParser en Python proporciona una forma útil de manejar la configuración de la línea de comandos y las aplicaciones de Python con GUI. Estos archivos de configuración también se pueden usar como bases de datos ligeras basadas en texto, pero pueden no ser adecuados para tipos de datos avanzados, grandes conjuntos de datos y una gran cantidad de consultas.

Vulkan para usuarios de Linux
Con cada nueva generación de tarjetas gráficas, vemos que los desarrolladores de juegos superan los límites de la fidelidad gráfica y se acercan un pa...
OpenTTD frente a Simutrans
Crear su propia simulación de transporte puede ser divertido, relajante y extremadamente atractivo. Es por eso que debes asegurarte de probar tantos j...
Tutorial de OpenTTD
OpenTTD es uno de los juegos de simulación empresarial más populares que existen. En este juego, necesitas crear un maravilloso negocio de transporte....