Lis et écrits des fichiers de configuration, similaires aux Windows INI, du genre de ceux éditables par les utilisateurs.
On peut ainsi utiliser ce module pour sauvegarder une petite quantité de données (au lieu de le faire dans une base de données), avec l'avantage que le fichier de configuration reste lisible.
Sources :
Ces fichiers de configurations sont scindés en section, chaque section pouvant contenir des couples nom-valeur de données de configuration. Les crochets [] encadrent les noms de section, le = sépare le nom de sa valeur :
[portal] url = http://%(host)s:%(port)s/Portal username = dhellmann host = localhost password = SECRET port = 8080
Considérons le fichier de configuration ci-dessus, intitulé .approachrc, et situé dans le home. Pour récupérer l'url :
>>> from ConfigParser import ConfigParser >>> config = ConfigParser() >>> config.read(['config.txt']) >>> url = config.get('portal', 'url')
Les valeurs host et port de l'url sont remplacées par localhost et 8080 par la méthode get().
Notons que, au lieu d'utiliser la methode get(), qui lit une chaîne de caractères, on peut utiliser getboolean(), getfloat() et getint(), pour lire des valeurs dans ces types.
Pour fixer la valeur d'une chaîne de caractères, on peut procéder ainsi :
>>> from ConfigParser import ConfigParser >>> config = ConfigParser() >>> config.read(['config.txt']) >>> config.get('GENERAL','repertoireMedia') 'Media2' >>> config.set('GENERAL','repertoireMedia','Media') >>> config.get('GENERAL','repertoireMedia') 'Media'
Le fichier de configuration étant chargé en mémoire, cette modification n'affecte pas le fichier de configuration (ici, config.txt) : voir la sous-section suivante, pour le faire.
S'il existe des méthodes get, getboolean, getint et getfloat, il n'existe qu'une méthode set.
Les seules valeurs que l'on peut rentrer, avec la méthode set, sont des chaînes de caractères.
Pour entrer la valeur entière 11 à l'option angle de la section ROTATION, on devra donc procéder ainsi :
>>> config.set('ROTATION','nombre','11')
De toutes façons, le fichier de configuration config.txt n'est constitué que de caractères, qui prennent leurs types définitifs au moment de la lecture, par le choix de la méthode associée :
>>> config.getint('ROTATION','nombre') 11 >>> config.get('ROTATION','nombre') '11' >>> config.getfloat('ROTATION','nombre') 11.0
Tout n'est cependant pas réalisable : si l'on a saisi (set) la valeur 11.0 pour l'angle de la rotation, on pourra la lire :
>>> config.set('ROTATION','nombre','11.0')
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.5/ConfigParser.py", line 321, in getint return self._get(section, int, option) File "/usr/lib/python2.5/ConfigParser.py", line 318, in _get return conv(self.get(section, option)) ValueError: invalid literal for int() with base 10: '11.0'
Pour sauvegarder ladite modification, il faut ouvrir le fichier config.txt en écriture, puis utiliser la méthode write de config, comme ci-dessous :
>>> fb=open('config.txt','w') >>> config.write(fb)
Cela se fait avec la méthode sections :
>>> from ConfigParser import ConfigParser >>> config = ConfigParser() >>> config.read(['config.txt']) >>>config.sections() ['ATTAQUE', 'SUITE_CHIFFREMENT', 'MARQUE', 'GENERAL', 'ONDELETTE', 'SUITE_BITSFORTSHOTE', 'HOTE_MARQUE', 'MARQUE_DECHIFFREE', 'MARQUE_EXTRAITE', 'SUITE_MARQUAGE', 'HOTE_MARQUE_ATTAQUE', 'CHIFFREMENT', 'ROTATION', 'COMPARAISON', 'SUITE_TELQUEL', 'SUITE_LOGISTIQUE', 'MARQUE_CHIFFREE', 'DECOUPAGE', 'HOTE', 'MARQUAGE', 'SUITE_ALEASBIN', 'REDIMENSION']
On peut ajouter, ou retirer une section, avec les méthodes add_section et remove_section :
>>> config.add_section('TOTO') >>> print config.sections() ['ATTAQUE', 'SUITE_CHIFFREMENT', 'MARQUE', 'GENERAL', 'ONDELETTE', 'SUITE_BITSFORTSHOTE', 'TOTO', 'HOTE_MARQUE', 'MARQUE_DECHIFFREE', 'MARQUE_EXTRAITE', 'SUITE_MARQUAGE', 'HOTE_MARQUE_ATTAQUE', 'CHIFFREMENT', 'ROTATION', 'COMPARAISON', 'SUITE_TELQUEL', 'SUITE_LOGISTIQUE', 'MARQUE_CHIFFREE', 'DECOUPAGE', 'HOTE', 'MARQUAGE', 'SUITE_ALEASBIN', 'REDIMENSION'] >>> config.remove_section('TOTO') True >>> print config.sections() ['ATTAQUE', 'SUITE_CHIFFREMENT', 'MARQUE', 'GENERAL', 'ONDELETTE', 'SUITE_BITSFORTSHOTE', 'HOTE_MARQUE', 'MARQUE_DECHIFFREE', 'MARQUE_EXTRAITE', 'SUITE_MARQUAGE', 'HOTE_MARQUE_ATTAQUE', 'CHIFFREMENT', 'ROTATION', 'COMPARAISON', 'SUITE_TELQUEL', 'SUITE_LOGISTIQUE', 'MARQUE_CHIFFREE', 'DECOUPAGE', 'HOTE', 'MARQUAGE', 'SUITE_ALEASBIN', 'REDIMENSION']
(Penser à sauvegarder.)
On peut tester si une section existe, avec la méthode has_section :
>>> config.has_section('GENERAL') True
Pour lister les options de la section GENERAL :
>>> config.options('GENERAL')
On peut aussi lister les items d'une section, c'est-à-dire les options avec leurs valeurs :
>>> config.items('GENERAL') [('chiffrement', 'False'), ('authentification', 'False'), ('repertoiremedia', 'Media'), ('attaque', 'True'), ('marquage', 'True'), ('demarquage', 'True'), ('comparaison', 'True')]
La méthode set ne sert pas seulement à fixer une valeur à une option existante. Elle permet aussi de créer une nouvelle option, comme l'illustre l'exemple suivant :
>>> config.options('ROTATION') ['angle', 'nombre'] >>> config.set('ROTATION','toto','12') >>> config.items('ROTATION') [('angle', '2.'), ('toto', '12'), ('nombre', '11.0')]
Pour supprimer cette option, on peut utiliser la méthode remove_option :
>>> config.remove_option('ROTATION','toto') True >>> config.items('ROTATION') [('angle', '2.'), ('nombre', '11.0')]
On peut tester si une option existe, avec la méthode has_option :
>>> config.has_option('GENERAL','angle') False