| Scopo | Leggere/scrivere file di configurazione simili ai file INI di Windows |
| Versione Python | 1.5 |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per il modulo ConfigParser
Il modulo ConfigParser si usa per gestire dei file di configurazione per un'applicazione che siano modificabii dall'utente. I file di configurazione sono organizzati in sezioni, ed ogni sezione può contenere coppie di nomi-valori per la configurazione di dati. L'interpolazione del valore tramite l'uso di stringhe di formattazione Python è supportata, per costruire valori che dipendono l'uno dall'altro (questo è particolarmente comdo per stringhe di messaggio ed URL).
Il formato di file usato da ConfigParser è simile a quello usato dalle vecchie versioni di Microsoft Windows. Consiste in una o più sezioni nominate, ognuna delle quali può contenere opzioni individuali con nomi e valori.
Le sezioni del file di configurazione sono identificate cercando delle righe che iniziano con [ e finiscono con ] . Il valore racchiuso tra le parentesi quadre è il nome della sezione, e può contenere qualsiasi carattere ad eccezione delle parentesi quadre.
Le opzioni sono elencate una per riga all'interno di una sezione. La riga inizia con il nome dell'opzione, la quale è separata dal valore dai due punti ( : ) oppure dall'uguale ( = ). I caratteri whitespace attorno al separatore vengono ignorati metre il file viene elaborato.
Un semplice file di configurazione con la sezione "bug_tracker", con tre opzioni dovrebbe avere il seguente aspetto:
[bug_tracker] url = http://localhost:8080/bugs/ username = dhellmann password = SECRET
L'uso più comune per un file di configurazione è quello di avere un utente od un amministratore di sistema che lo modifichi con un normale editor di file per impostare i comportamenti predefiniti dell'applicazione, quindi il file vien fatto leggere dall'applicazione, che lo elabora ed agisce in base al suo contenuto. Per leggere il file di configurazione si usa il metodo
read()
di
SafeConfigParser
.
from ConfigParser import SafeConfigParser
parser = SafeConfigParser()
parser.read('simple.ini')
print parser.get('bug_tracker', 'url')
Il programma legge il file simple.ini visto qui sopra e stampa il valore dell'opzione url dalla sezione bug_tracker .
$ python ConfigParser_read.py http://localhost:8080/bugs/
Il metodo
read()
accetta anche un elenco di nomi di file. Ciascun nome viene scorso a turno, e se il file esiste viene aperto e letto.
from ConfigParser import SafeConfigParser
import glob
parser = SafeConfigParser()
candidates = ['non_esiste.ini', 'anche-questo-non-esiste.ini',
'simple.ini', 'multisezione.ini',
]
found = parser.read(candidates)
missing = set(candidates) - set(found)
print 'File di configurazione trovati :', sorted(found)
print 'File di configurazione mancanti:', sorted(missing)
read()
restituisce un elenco che contiene i nomi dei file caricati con successo, in modo che il programma possa scoprire quali file di configurazione sono mancanti e decidere se ignorarli.
$ python ConfigParser_read_many.py File di configurazione trovati : ['simple.ini'] File di configurazione mancanti: ['anche-questo-non-esiste.ini', 'multisezione.ini', 'non_esiste.ini']
I file di configurazione che contengono dati Unicode dovrebbero essere aperti con il modulo codecs per impostare il valore di codifica appropriato.
Modificare il valore di password originale in modo che contengo caratteri Unicode e salvare i risultati nella codifica UTF-8 genera:
[bug_tracker] url = http://localhost:8080/bugs/ username = dhellmann password = ßéç®é†
Il file handle di
codecs
può essere passato a
readfp()
, il quale usa il metodo
readline()
dei suoi parametri per ottenere le righe dal file ed analizzarle.
from ConfigParser import SafeConfigParser
import codecs
parser = SafeConfigParser()
# Apre il file con la codifica corretta
with codecs.open('unicode.ini', 'r', encoding='utf-8') as f:
parser.readfp(f)
password = parser.get('bug_tracker', 'password')
print 'Password:', password.encode('utf-8')
print 'Type :', type(password)
print 'repr() :', repr(password)
Il valore restituito da
get()
è un oggetto
unicode
, quindi per stamparlo in sicurezza deve essere ricodificato come UTF-8.
$ python ConfigParser_unicode.py Password: ßéç®é† Type :repr() : u'\xdf\xe9\xe7\xae\xe9\u2020'
Vedere anche: