Python

Comment lire et écrire des fichiers INI et Conf à l'aide de Python

Comment lire et écrire des fichiers INI et Conf à l'aide de Python
Le langage de programmation Python est livré avec un module intégré utile appelé « ConfigParser » qui peut être utilisé pour écrire proprement les paramètres de configuration des applications. ConfigParser utilise un langage de configuration bien défini et structuré entièrement compatible avec les fichiers INI trouvés dans Microsoft Windows. Ces fichiers INI peuvent également être utilisés avec des applications Python fonctionnant sous Linux et ils fournissent un moyen persistant de stocker et de récupérer des valeurs.

Sous Linux, il est plus courant de voir «.conf" que ".ini" fichiers. Les fichiers de configuration sous Linux sont comme n'importe quel autre fichier texte et, par conséquent, ils peuvent être structurés de n'importe quelle manière. Cela dépend de l'analyseur comment il interprète un ".conf" fichier. Le module ConfigParser de Python peut analyser ".conf" également (ou toute autre extension aléatoire), à ​​condition que ces fichiers soient définis dans un langage de configuration compatible INI. Cet article vous expliquera la lecture et l'écriture ".conf" sous Linux en utilisant la dernière version stable de Python 3. Notez que si vous remplacez toutes les occurrences de ".conf" dans cet article avec ".ini", le résultat serait le même. Le processus et le code expliqués ci-dessous devraient également être principalement compatibles avec Microsoft Windows, avec quelques différences mineures. Bien que ces différences ne soient pas abordées dans cet article.

Module d'analyse de configuration

L'analyseur de fichier de configuration ou ConfigParser est un module Python qui vous permet de lire et d'écrire des fichiers de configuration utilisés dans les applications Python. Comme expliqué ci-dessus, ce module prend en charge la syntaxe du fichier INI. Un très simpliste ".ini" / ".conf" ressemble à ceci.

[DÉFAUT]
son = 1
musique = 1
volume = 0.8
résolution = 1920x1080
[Utilisateur]
# le son peut avoir 0 (faux) et 1 (vrai) comme valeurs possibles
son = 1
; la musique peut avoir 0 (faux) et 1 (vrai) comme valeurs possibles
musique = 0
Volume = 0.4
résolution = 1280x720

L'exemple ".conf" ci-dessus a deux sections, "DEFAULT" et "User". Habituellement, les programmes Python sont codés de manière à ce que les valeurs de la section DEFAULT ne soient jamais modifiées. La section DEFAULT est utilisée pour réinitialiser les valeurs globales ou individuelles aux valeurs par défaut. La section utilisateur reflète les modifications apportées par un utilisateur final qui utilise le programme Python. Notez que les noms de section peuvent être n'importe quoi et qu'il n'est pas du tout nécessaire d'avoir une section DEFAULT. Cependant, chaque fois que la section « DEFAULT » est présente (le nom doit être en majuscule), elle sera utilisée pour fournir en toute sécurité les valeurs par défaut si ConfigParser ne parvient pas à analyser certaines variables. La logique pour gérer ces sections, les variables sous-jacentes et les valeurs de secours doivent être définies dans le programme Python lui-même. Des symboles comme « # » et « ; » peut être utilisé pour désigner des commentaires dans ".conf" fichiers. Toutes les paires clé-valeur dans le fichier de configuration sont insensibles à la casse, généralement écrites en minuscules.

Gestion des types de données par ConfigParser

Avant d'aller de l'avant avec quelques exemples de ConfigParser, il est important de comprendre la gestion des types de données par ce module. Pour ConfigParser, chaque morceau de code écrit ou analysé est une chaîne. Il ne peut pas différencier les nombres ou tout autre format. Les programmeurs doivent écrire une logique dans leur programme pour convertir une chaîne "1234" en nombre en utilisant int ("1234") lors de la lecture des données d'un ".conf" fichier.

Bien que la conversion en nombres à l'aide des méthodes int et float soit une tâche assez facile, la conversion en booléen peut être délicate car Python traite bool ("any_string") comme True. Pour surmonter ce problème, vous pouvez utiliser des instructions conditionnelles vérifiant une chaîne spécifique. Le module ConfigParser fournit également une méthode appelée "getboolean()". Cette méthode peut différencier correctement les valeurs booléennes 'yes'/'no', 'on'/'off', 'true'/'false' et '1'/'0' même si ce sont des chaînes. ConfigParser inclut également les méthodes getint() et getfloat() pour votre commodité.

Écriture et enregistrement d'un nouveau fichier de configuration à l'aide de ConfigParser

Supposons que le ".conf" mentionné ci-dessus n'existe pas et vous souhaitez le créer automatiquement au premier lancement du programme. Le code ci-dessous créera un nouveau "paramètres.conf" dans le répertoire à partir duquel le programme Python a été exécuté.

importer l'analyseur de configuration
config = configparser.ConfigParser()
config['DEFAULT'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
config['Utilisateur'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
avec open('paramètres.conf', 'w') comme fichier de configuration :
configuration.écrire (fichier de configuration)

La première instruction dans le code ci-dessus importe le module ConfigParser. La deuxième instruction crée un objet de type dictionnaire appelé "config". Vous pouvez maintenant utiliser la syntaxe standard du dictionnaire Python pour définir les sections et les variables incluses en dessous, comme le montrent les deux instructions suivantes. Enfin, l'instruction « with open » crée un nouveau « settings.conf" et écrit les sections de configuration dans le fichier.

Le code ci-dessus fonctionne, mais il y a un petit problème avec lui. Il crée un nouveau fichier de paramètres à chaque exécution du programme, ce qui entraîne l'écrasement de toutes les modifications apportées par l'utilisateur au fichier de paramètres. Pour résoudre ce problème, vous devez vérifier deux conditions :

Le code modifié ci-dessous vérifiera les deux conditions et ne créera un nouveau fichier de paramètres que si ces deux conditions sont remplies.

importer l'analyseur de configuration
importer le système d'exploitation
 
config = configparser.ConfigParser()
config['DEFAULT'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
config['Utilisateur'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
fichier_paramètres = os.chemin.dirname(os.chemin.chemin réel(__fichier__))
+ système d'exploitation.sep + "paramètres.conf"
sinon os.chemin.existe (fichier_paramètres)
ou os.stat(settings_file).taille_st == 0 :
avec open('paramètres.conf', 'w') comme fichier de configuration :
configuration.écrire (fichier de configuration)

La deuxième instruction dans le code ci-dessus importe le module "os". La variable "settings_file" stocke le chemin complet vers le "settings.conf" à créer dans le répertoire du script Python. L'instruction suivante vérifie deux conditions mentionnées ci-dessus. La première clause de la déclaration est explicite. La deuxième clause vérifie si la taille du fichier est « 0 octets ». Un fichier de zéro octet signifierait un fichier vide sans aucune donnée stockée dedans. Le reste du code est le même que le premier exemple indiqué ci-dessus.

Jusqu'à présent, les exemples de code expliqués ci-dessus enregistrent le fichier de configuration dans le répertoire du script Python lui-même. Cependant, c'est une pratique courante et une norme freedesktop d'enregistrer les fichiers de configuration dans le ".config" dans le dossier home. L'exemple de code ci-dessous créera un nouveau "paramètres.conf" dans "~/.dossier "config/testapp".

importer l'analyseur de configuration
importer le système d'exploitation
 
app_name = "testapp"
dossier_config = os.chemin.rejoindre (os.chemin.expanduser("~"), '.config', nom_application)
système d'exploitation.makedirs(config_folder, exist_ok=True)
settings_file = "paramètres.conf"
full_config_file_path = os.chemin.join(config_folder, settings_file)
 
config = configparser.ConfigParser()
config['DEFAULT'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
config['Utilisateur'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
 
sinon os.chemin.existe (full_config_file_path)
ou os.stat(full_config_file_path).taille_st == 0 :
avec open(full_config_file_path, 'w') comme fichier de configuration :
configuration.écrire (fichier de configuration)

Le code ci-dessus est presque le même que l'exemple précédent, sauf qu'il modifie l'emplacement de "settings.conf" vers "~/.config/testapp/paramètres.conf". La variable "config_folder" stocke le chemin complet vers le dossier de l'application à créer dans ".config" répertoire ("~/.config/testapp/”). Le « os ».makedirs" ne créera un nouveau dossier d'application que s'il n'existe pas déjà. La variable "full_config_file_path" stocke le chemin complet du fichier de paramètres ("~/.config/testapp/paramètres.conf"). Le reste du code est explicite.

Lire un fichier de configuration à l'aide de ConfigParser

L'analyse d'un fichier de configuration est assez simple. Le ConfigParser tente de lire une valeur en utilisant les méthodes get(), getfloat(), getboolean() ou la syntaxe du dictionnaire. En cas d'erreur de clé, les valeurs de la section DEFAULT ou les valeurs de repli sont utilisées. C'est une bonne pratique de définir la section DEFAULT ou les valeurs de secours pour éviter les erreurs de clé. Vous pouvez également utiliser des instructions try-except pour supprimer les erreurs.

config = configparser.ConfigParser()
configuration.lire (full_config_file_path)
 
is_sound_on = config['Utilisateur'].getboolean('son')
niveau_volume = config['Utilisateur'].getfloat('volume')
résolution = config['Utilisateur']['résolution']
 
# La valeur de repli "False" sera ignorée car il y a déjà une section DEFAULT.
# En l'absence de section DEFAULT, la valeur de repli sera dûment utilisée.
is_music_on = config['Utilisateur'].getboolean('musique', faux)
 
print (is_sound_on, is_music_on, volume_level, résolution)

Dans l'exemple de code ci-dessus, "config.read" est utilisé pour lire les données d'un fichier de configuration. Dans les instructions suivantes, diverses méthodes get intégrées et notations de dictionnaire sont utilisées pour lire les données. Dans la déclaration de la variable « is_music_on », le deuxième argument est la valeur de repli (False). Notez que les valeurs de secours auront une priorité inférieure aux valeurs définies dans la section DEFAULT. En termes simples, les valeurs de repli n'auront aucun effet lorsqu'une paire clé-valeur est déjà présente dans la section DEFAULT.

Code complet

Vous trouverez ci-dessous l'intégralité du code combinant à la fois la création du premier run du fichier de configuration et la lecture du fichier de configuration.

#! /usr/bin/python3
importer l'analyseur de configuration
importer le système d'exploitation
 
app_name = "testapp"
dossier_config = os.chemin.rejoindre (os.chemin.expanduser("~"), '.config', nom_application)
système d'exploitation.makedirs(config_folder, exist_ok=True)
settings_file = "paramètres.conf"
full_config_file_path = os.chemin.join(config_folder, settings_file)
 
config = configparser.ConfigParser()
 
config['DEFAULT'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
config['Utilisateur'] = "son" : "1", "musique" : "1",
"volume" : "0.8", "résolution" : "1920x1080"
 
sinon os.chemin.existe (full_config_file_path)
ou os.stat(full_config_file_path).taille_st == 0 :
avec open(full_config_file_path, 'w') comme fichier de configuration :
configuration.écrire (fichier de configuration)
 
configuration.lire (full_config_file_path)
is_sound_on = config['Utilisateur'].getboolean('son')
niveau_volume = config['Utilisateur'].getfloat('volume')
résolution = config['Utilisateur']['résolution']
 
# La valeur de repli "False" sera ignorée car il y a déjà une section DEFAULT.
# En l'absence de section DEFAULT, la valeur de repli sera dûment utilisée.
is_music_on = config['Utilisateur'].getboolean('musique', faux)
 
print (is_sound_on, is_music_on, volume_level, résolution)

Conclusion

ConfigParser en Python fournit un moyen utile de gérer les paramètres des applications Python en ligne de commande et GUI. Ces fichiers de configuration peuvent également être utilisés comme bases de données textuelles légères, mais peuvent ne pas convenir aux types de données avancés, aux grands ensembles de données et au grand nombre de requêtes.

Tutoriel Shadow of the Tomb Raider pour Linux
Shadow of the Tomb Raider est le douzième ajout à la série Tomb Raider - une franchise de jeux d'action-aventure créée par Eidos Montréal. Le jeu a ét...
Comment booster les FPS sous Linux?
FPS signifie Images par seconde. La tâche du FPS est de mesurer la fréquence d'images dans les lectures vidéo ou les performances de jeu. En termes si...
Meilleurs jeux de laboratoire d'applications Oculus
Si vous êtes propriétaire d'un casque Oculus, vous devez être au courant du chargement latéral. Le chargement latéral est le processus d'installation ...