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 des paramètres de configuration pour les applications proprement. 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 être utilisés avec des applications Python en cours d'exécution dans Linux et ils fournissent un moyen persistant de stocker et de récupérer des valeurs.

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

Module configParser

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 ”/".Le fichier 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 des valeurs possibles
son = 1
; La musique peut avoir 0 (false) et 1 (vrai) comme des valeurs possibles
musique = 0
Volume = 0.4
Résolution = 1280x720

L'exemple ".Le fichier conf ”ci-dessus a deux sections,« par défaut »et« utilisateur ». Habituellement, les programmes Python sont codés de manière à ce que les valeurs de section par défaut ne soient jamais modifiées. La section par défaut 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 nécessaire d'avoir une section par défaut du tout. Cependant, chaque fois que la section «par défaut» est présente (le nom doit être en maîtrise en majus. La logique pour gérer ces sections, les variables sous eux 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 les commentaires dans «.Fichiers Conf ». Toutes les paires de valeurs de clé dans le fichier de configuration sont insensibles à la casse, généralement écrites en minuscules.

Gestion des données par configParser

Avant d'aller de l'avant avec quelques exemples de configParser, il est important de comprendre la gestion des données de données par ce module. Pour ConfigParser, chaque morceau de code écrit ou analysé est une chaîne. Il ne peut faire la différence entre les nombres ou tout autre format. Les programmeurs doivent écrire une logique dans leur programme pour convertir une chaîne «1234» en numéro en utilisant int («1234») tout en lisant les données d'un «.Fichier Conf ”.

Lors de la conversion en nombres à l'aide de la méthode int et float est une tâche assez facile, la conversion en booléen peut être délicate car Python traite Bool ("any_string") pour être vrai. Pour surmonter ce problème, vous pouvez utiliser des instructions conditionnelles pour vérifier une chaîne spécifique. Le module configParser fournit également une méthode appelée «getBoolean ()». Cette méthode peut différencier correctement «oui» / «non», «sur» / «off», «true» / «false» et «1» / «0» booléen, même si ce sont des cordes. ConfigParser comprend également des méthodes getInt () et getFloat () pour votre commodité.

Écriture et enregistrer un nouveau fichier confilation à l'aide de configPaser

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

Importer ConfigParser
config = configParser.ConfigParser ()
config ['default'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
config ['utilisateur'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
avec Open ('' Paramètres.conf ',' w ') comme configfile:
configurer.écrire (configFile)

La première instruction du code ci-dessus importe le module configParser. La deuxième déclaration crée un objet de type dictionnaire appelé «config». Vous pouvez désormais utiliser la syntaxe du dictionnaire Python standard pour définir des sections et des variables incluses sous eux, comme en témoignent les deux déclarations suivantes. Enfin, la déclaration «avec ouverte» crée un nouveau «paramètres.Fichier Conf ”et écrit des sections de configuration dans le fichier.

Le code ci-dessus fonctionne, mais il y a un petit problème avec. Il crée un nouveau fichier de paramètres à chaque fois que le programme est exécuté, ce qui entraîne l'écrasement de toute modification utilisée par l'utilisateur dans le fichier de paramètres. Pour résoudre ce problème, vous devez vérifier deux conditions:

  • Le fichier de paramètres existe-t-il? Sinon, créez un nouveau fichier de paramètres uniquement si le fichier n'existe pas.
  • Le fichier de paramètres existe, mais contient-il des données? Est-ce vide? Écrivez de nouvelles données de configuration dans le fichier de paramètres uniquement si elle est vide.

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 ConfigParser
Importer un système d'exploitation
config = configParser.ConfigParser ()
config ['default'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
config ['utilisateur'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
Settings_file = OS.chemin.dirname (OS.chemin.realpath (__ file__))
+ OS.SEP + "Paramètres.conf
Sinon OS.chemin.existe (Settings_file)
ou OS.STAT (Settings_file).ST_SIZE == 0:
avec Open ('' Paramètres.conf ',' w ') comme configfile:
configurer.écrire (configFile)

La deuxième instruction du code ci-dessus importe le module «OS». La variable «Settings_file» stocke le chemin complet vers les «Paramètres.fichier conf ”à créer dans le répertoire du script python. L'énoncé suivant vérifie les deux conditions mentionnées ci-dessus. La première clause de la déclaration est l'explication de soi. La deuxième clause vérifie si la taille du fichier est «0 octets». Un fichier d'octet zéro signifierait un fichier vide sans données stockées. Le reste du code est le même que le premier exemple énoncé ci-dessus.

Jusqu'à présent, les échantillons de code expliqués ci-dessus enregistrent le fichier de configuration dans le répertoire du script Python lui-même. Cependant, il s'agit d'une pratique courante et d'une norme Freedesktop pour enregistrer les fichiers de configuration dans le «.Répertoire de configuration »dans le dossier à domicile. L'exemple de code ci-dessous créera un nouveau «paramètres.fichier conf ”dans" ~ /.Folder Config / TestApp ».

Importer ConfigParser
Importer un système d'exploitation
app_name = "testapp"
config_folder = os.chemin.rejoindre (OS.chemin.Extenger ("~"), '.config ', app_name)
OS.MakeDirs (config_folder, exist_ok = true)
paramètres_file = "Paramètres.conf
full_config_file_path = os.chemin.join (config_folder, settings_file)
config = configParser.ConfigParser ()
config ['default'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
config ['utilisateur'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
Sinon OS.chemin.existant (full_config_file_path)
ou OS.stat (full_config_file_path).ST_SIZE == 0:
avec Open (full_config_file_path, 'W') comme configfile:
configurer.écrire (configFile)

Le code ci-dessus est presque le même que l'exemple précédent, sauf qu'il modifie l'emplacement des «paramètres.fichier conf ”à" ~ /.config / testapp / Paramètres.conf. La variable «config_folder» stocke le chemin complet du dossier d'application à créer dans «.Répertoire config »(« ~ /.config / testapp / ”). Le «OS.L'instruction 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 conf

Analyser un fichier de configuration est assez simple. Le configParser tente de lire une valeur en utilisant get (), getfloat (), getboolean () méthodes ou syntaxe du dictionnaire. En cas d'erreur de clé, les valeurs de la section par défaut ou les valeurs de secours sont utilisées. C'est une bonne pratique de définir la section par défaut ou les valeurs de secours pour éviter les erreurs clés. Vous pouvez également utiliser des instructions à l'exception pour supprimer les erreurs.

config = configParser.ConfigParser ()
configurer.lire (full_config_file_path)
is_sound_on = config ['user'].getboolean ('son')
volume_level = config ['user'].getFloat ('volume')
résolution = config ['utilisateur'] ['résolution']
# La valeur de secours "false" sera ignoré car il y a déjà une section par défaut.
# En l'absence de section par défaut, la valeur de secours sera dûment utilisée.
is_music_on = config ['user'].getboolean («musique», faux)
print (is_sound_on, is_music_on, volume_level, résolution)

Dans l'échantillon de code ci-dessus, «Config.La lecture de l'instruction est utilisée pour lire les données d'un fichier de configuration. Dans les déclarations suivantes, diverses méthodes de GET intégrées et notations du dictionnaire sont utilisées pour lire les données. Dans la déclaration de variable "is_music_on", le deuxième argument est la valeur de secours (false). Notez que les valeurs de secours auront une priorité plus faible que les valeurs définies dans la section par défaut. En termes simples, les valeurs de secours n'auront aucun effet lorsqu'une paire de valeurs clés est déjà présente dans la section par défaut.

Code complet

Vous trouverez ci-dessous le code entier combinant à la fois la première création d'exécution du fichier de configuration et la lecture du fichier de configuration.

#! / usr / bin / python3
Importer ConfigParser
Importer un système d'exploitation
app_name = "testapp"
config_folder = os.chemin.rejoindre (OS.chemin.Extenger ("~"), '.config ', app_name)
OS.MakeDirs (config_folder, exist_ok = true)
paramètres_file = "Paramètres.conf
full_config_file_path = os.chemin.join (config_folder, settings_file)
config = configParser.ConfigParser ()
config ['default'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
config ['utilisateur'] = "Sound": "1", "Music": "1",
"Volume": "0.8 "," Résolution ":" 1920x1080 "
Sinon OS.chemin.existant (full_config_file_path)
ou OS.stat (full_config_file_path).ST_SIZE == 0:
avec Open (full_config_file_path, 'W') comme configfile:
configurer.écrire (configFile)
configurer.lire (full_config_file_path)
is_sound_on = config ['user'].getboolean ('son')
volume_level = config ['user'].getFloat ('volume')
résolution = config ['utilisateur'] ['résolution']
# La valeur de secours "false" sera ignoré car il y a déjà une section par défaut.
# En l'absence de section par défaut, la valeur de secours sera dûment utilisée.
is_music_on = config ['user'].getboolean («musique», faux)
print (is_sound_on, is_music_on, volume_level, résolution)

Conclusion

ConfigParser dans Python fournit un moyen utile de gérer les paramètres des applications de ligne de commande et de GUI Python. Ces fichiers de configuration peuvent également être utilisés comme bases de données basées sur du texte léger, mais peuvent ne pas convenir pour les données avancées, les grands ensembles de données et le grand nombre de requêtes.