par , 25/10/2014 à 09h47 (3883 Affichages)
[exemple de billet pour voir comment ça marche!]
Les fichiers "ini" sont des fichiers texte qui sont souvent intéressants pour conserver des données de configuration d'un programme, parce qu'ils permettent d'être consultés et, si nécessaire, modifiés en dehors des sessions du programme avec un simple éditeur de texte:
[section1]
option1_1 = toto
option1_2 = tata
[section2]
option2_1 = 123
option2_2 = hfdcjvcjgtjvgtvjgjv
option2_3 = 78.987
En Python (version 3 ici), on utilise le module "configparser". Mais plutôt que de manipuler directement les objets de ce module, je préfère intégrer dans mes programmes un fichier de bibliothèque "bibini.py" qui contient 2 fonctions qui permettent très facilement de charger et d'enregistrer un "dictionnaire de dictionnaires" qui est l'image du fichier "ini". Pour prendre l'exemple ci-dessus, dico["section2"]["option2_1"] contiendra "123".
J'utilise ici un dictionnaire ordonné (OrderedDict du module collections) pour que le fichier "ini" présente les données toujours dans le même ordre des sections et des options. Si cet aspect purement esthétique est inutile, il est facile de modifier le script pour utiliser le dictionnaire normal "dict".
Entête et importations:
1 2 3 4 5 6
| #!/usr/bin/python
# -*- coding: utf-8 -*-
# Python 3
from configparser import ConfigParser
from collections import OrderedDict |
Chargement du fichier "ini:
1 2 3 4 5 6 7 8 9 10 11 12 13
| def chargini(ficini, encodage="utf-8"):
"""charge le contenu du fichier ini 'ficini' avec l'encodage 'encodage'
retourne le dictionnaire de dictionnaires ordonné, image des données
"""
cfg = ConfigParser()
with open(ficini, 'r', encoding=encodage) as fs:
cfg.read_file(fs)
dini = OrderedDict()
for section in cfg.sections():
dini[section] = OrderedDict()
for option, valeur in cfg.items(section):
dini[section][option] = valeur
return dini |
Enregistrement dans un fichier "ini":
1 2 3 4 5 6 7 8 9 10 11
| def sauvini(dini, ficini, encodage="utf-8"):
"""sauve le dictionnaire de dictionnaires 'dini' dans le fichier ini
'ficini' avec l'encodage 'encodage'
"""
cfg = ConfigParser()
for section in dini:
cfg.add_section(section)
for option, valeur in dini[section].items():
cfg.set(section, option, valeur)
with open(ficini, 'w', encoding=encodage) as fd:
cfg.write(fd) |
Une fois le fichier "bibini.py" ainsi construit, il suffit de l'intégrer dans un programme et de l'importer comme suit pour gérer le fichier "ini" en tant que dictionnaire:
1 2 3 4 5 6
| from bibini import chargini, sauvini
...
dico = chargini("config.ini")
...
sauvini(dico, "config.ini")
... |