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

Cómo leer y escribir archivos INI y conf usando Python
Python Programming Language viene con un módulo integrado útil llamado "configParser" que puede usarse para escribir limpiamente los parámetros de configuración para aplicaciones. Configparser utiliza un lenguaje de configuración bien definido y estructurado totalmente compatible con 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 proporcionan una forma persistente de almacenar y recuperar valores.

En Linux, es más común ver ".archivos conf "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 de cómo interpreta un ".archivo conf ”. El módulo ConfigParser de Python puede analizar ".Los archivos conf ”también (o cualquier otra extensión aleatoria), siempre que estos archivos se definan en el lenguaje de configuración compatible con INI. Este artículo explicará la lectura y la escritura ".archivos conf ”en Linux utilizando la última versión estable de Python 3. Tenga en cuenta que si reemplaza todas las ocurrencias de ".extensión conf "en este artículo con".Extensión ini ”, el resultado sería el mismo. El proceso y el código explicado a continuación también deben ser principalmente compatibles 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 Python que le permite leer y escribir archivos de configuración utilizados en las aplicaciones de Python. Como se explicó anteriormente, este módulo admite la sintaxis del archivo INI. Un muy simplista ".ini " /".el archivo conf ”se ve así.

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

El ejemplo ".El archivo de conf "arriba tiene dos secciones," predeterminado "y" usuario ". Por lo general, los programas de Python se codifican de tal manera que los valores de sección predeterminados nunca se cambian. La sección predeterminada se usa para restablecer los valores generales o individuales a los valores predeterminados. La sección del usuario refleja los cambios realizados por un usuario final que está utilizando el programa Python. Tenga en cuenta que los nombres de la sección pueden ser cualquier cosa y no es necesario tener una sección predeterminada en absoluto. Sin embargo, siempre que la sección "predeterminada" esté presente (el nombre debe estar en mayúsculas), se utilizará para proporcionar valores predeterminados de manera segura si configParser no analiza ciertas variables. La lógica para manejar estas secciones, variables debajo de ellas y valores de retroceso debe definirse en el programa de Python en sí. Símbolos como "#" y ";" se puede usar para denotar comentarios en ".archivos conf ”. Todos los pares de valor clave en el archivo de configuración son insensibles a la caja, generalmente escritos en minúsculas.

Manejo de tipos de datos por configparser

Antes de seguir adelante con algunos ejemplos de configparser, es importante comprender el manejo de los tipos de datos mediante este módulo. Para configParser, cada pieza de código escrito o analizado es una cadena. No puede diferenciar entre números o ningún otro formato. Los programadores deben escribir lógica en su programa para convertir una cadena "1234" en número usando int ("1234") mientras lee datos de un ".archivo conf ”.

Si bien convertir a números que usan el método int y float es una tarea bastante fácil, convertir a booleano puede ser complicado ya que Python trata a Bool ("Any_string") como verdadero. Para superar este problema, puede usar la verificación de declaraciones condicionales para una cadena específica. El módulo configParser también proporciona un método llamado "getBoolean ()". Este método puede diferenciar correctamente 'sí'/'no', 'en'/'off', 'verdadero'/'falso' y '1' '/' 0 'valores booleanos incluso si son cadenas. Configparser también incluye getInt () y getfloat () métodos para su conveniencia.

Escribir y guardar un nuevo archivo conf usando configparser

Supongamos el ".El archivo 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.Archivo conf ”en el directorio desde el cual se ha ejecutado el programa Python.

Importar configParser
config = configParser.ConfigParser ()
config ['default'] = "sonido": "1", "música": "1",
"Volumen": "0.8 "," Resolución ":" 1920x1080 "
config ['user'] = "sonido": "1", "música": "1",
"Volumen": "0.8 "," Resolución ":" 1920x1080 "
con open ('Configuración.conf ',' W ') como confil:
configuración.escribir (configfile)

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 del diccionario de Python estándar para definir secciones y variables incluidas en ellas, como lo eviden las siguientes dos declaraciones. Por último, la declaración "con abierta" crea una nueva "configuración.File conf ”y escribe secciones de configuración en el archivo.

El código anterior funciona, pero hay un pequeño problema con ello. Crea un nuevo archivo de configuración cada vez que se ejecuta el programa, lo que resulta en la sobrescribencia de cualquier edición realizada por el usuario al archivo de configuración. Para solucionar este problema, debe verificar dos condiciones:

  • ¿Existe el archivo de configuración?? Si no, crea un nuevo archivo de configuración solo si el archivo no existe.
  • El archivo de configuración existe, pero contiene cualquier dato? ¿Está vacío?? Escriba nuevos datos de configuración en el archivo de configuración solo si está vacío.

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 ":" 1920x1080 "
config ['user'] = "sonido": "1", "música": "1",
"Volumen": "0.8 "," Resolución ":" 1920x1080 "
settings_file = OS.camino.Dirname (OS.camino.RealPath (__ archivo__))
+ sistema operativo.Configuración de SEP + ".conf "
Si no es un sistema operativo.camino.existe (settings_file)
u sistema operativo.stat (settings_file).st_size == 0:
con open ('Configuración.conf ',' W ') como confil:
configuración.escribir (configfile)

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.File conf ”que se creará en el directorio del script de Python. La siguiente declaración verifica dos condiciones mencionadas anteriormente. La primera cláusula en 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 byte cero significaría un archivo vacío sin datos almacenados en él. El resto del código es el mismo que el primer ejemplo indicado anteriormente.

Hasta ahora, las muestras de código explicadas anteriormente guarde el archivo de configuración en el directorio del script de python en sí. Sin embargo, es una práctica común y un estándar de Freedesktop para guardar archivos de configuración en el ".directorio de config "en la carpeta de inicio. La muestra de código a continuación creará una nueva "Configuración.File conf "en" ~/.carpeta config/testApp ”.

Importar configParser
importar sistema operativo
app_name = "testApp"
config_folder = OS.camino.unirse (OS.camino.Expanduser ("~"), '.config ', app_name)
sistema operativo.Makedirs (config_folder, exist_ok = true)
settings_file = "Configuración.conf "
full_config_file_path = OS.camino.unirse (config_folder, settings_file)
config = configParser.ConfigParser ()
config ['default'] = "sonido": "1", "música": "1",
"Volumen": "0.8 "," Resolución ":" 1920x1080 "
config ['user'] = "sonido": "1", "música": "1",
"Volumen": "0.8 "," Resolución ":" 1920x1080 "
Si no es un sistema operativo.camino.existe (full_config_file_path)
u sistema operativo.STAT (full_config_file_path).st_size == 0:
con Open (full_config_file_path, 'w') como confil:
configuración.escribir (configfile)

El código anterior es casi el mismo que el ejemplo anterior, excepto por su vez, cambia la ubicación de "Configuración.File conf "a" ~/.config/testApp/settings.conf ". La variable "config_folder" almacena la ruta completa a la carpeta de la aplicación que se creará en ".directorio de configuración "(" ~/.config/testApp/"). El "sistema operativo.La declaración de 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 usando configparser

Analizar un archivo de configuración es bastante sencillo. El ConfigParser intenta leer un valor usando get (), getFloat (), getBoolean () Métodos o sintaxis del diccionario. En el caso de un error clave, se utilizan valores de la sección predeterminados o valores de respuesta. Es una buena práctica definir la sección predeterminada o los valores de retroceso para evitar errores clave. Puede usar las declaraciones Try-Except también para suprimir los errores.

config = configParser.ConfigParser ()
configuración.leer (full_config_file_path)
is_sound_on = config ['user'].getBoolean ('sonido')
volumen_level = config ['user'].getFloat ('volumen')
resolución = config ['user'] ['resolución']
# Valor devolioso "Falso" se ignorará ya que ya hay una sección predeterminada.
# En ausencia de la sección predeterminada, el valor de retroceso se utilizará debidamente.
is_music_on = config ['user'].GetBoolean ('Música', False)
print (is_sound_on, is_music_on, volumen_level, resolución)

En la muestra de código anterior, "config.La declaración de lectura "se usa para leer datos de un archivo de configuración. En las siguientes afirmaciones, se utilizan varios métodos GET incorporados y anotaciones de diccionario para leer los datos. En la declaración de la variable "IS_MUSIC_ON", el segundo argumento es el valor de retroceso (falso). Tenga en cuenta que los valores de retroceso tendrán una precedencia menor que los valores definidos en la sección predeterminada. En términos simples, los valores de retroceso no tendrán ningún efecto cuando un par de valor clave ya esté presente en la sección predeterminada.

Código completo

A continuación se muestra todo el código 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 ', app_name)
sistema operativo.Makedirs (config_folder, exist_ok = true)
settings_file = "Configuración.conf "
full_config_file_path = OS.camino.unirse (config_folder, settings_file)
config = configParser.ConfigParser ()
config ['default'] = "sonido": "1", "música": "1",
"Volumen": "0.8 "," Resolución ":" 1920x1080 "
config ['user'] = "sonido": "1", "música": "1",
"Volumen": "0.8 "," Resolución ":" 1920x1080 "
Si no es un sistema operativo.camino.existe (full_config_file_path)
u sistema operativo.STAT (full_config_file_path).st_size == 0:
con Open (full_config_file_path, 'w') como confil:
configuración.escribir (configfile)
configuración.leer (full_config_file_path)
is_sound_on = config ['user'].getBoolean ('sonido')
volumen_level = config ['user'].getFloat ('volumen')
resolución = config ['user'] ['resolución']
# Valor devolioso "Falso" se ignorará ya que ya hay una sección predeterminada.
# En ausencia de la sección predeterminada, el valor de retroceso se utilizará debidamente.
is_music_on = config ['user'].GetBoolean ('Música', False)
print (is_sound_on, is_music_on, volumen_level, resolución)

Conclusión

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