2009-07-15 11 views
6

Ho notato con il mio controllo del codice sorgente che il contenuto dei file di output generati con ConfigParser non è mai nello stesso ordine. A volte le sezioni cambieranno posto o opzioni all'interno delle sezioni anche senza alcuna modifica ai valori.Mantieni ordinati i file di output di ConfigParser

C'è un modo per mantenere le cose ordinate nel file di configurazione in modo che non debba eseguire modifiche banali ogni volta che lancio la mia applicazione?

+0

[Questa risposta] (http://stackoverflow.com/questions/1984759/export-with-alphabetical-sort-in-python-configparser/1984787#1984787) a una domanda simile fornisce alcuni suggerimenti su come eseguire l'ordine output in Python 2. –

risposta

8

Sembra che questo è stato fissato in Python 3.1 e 2.7 con l'introduzione di dizionari ordinate:

La libreria standard ora supporta l'uso di di dizionari ordinati in diversi moduli . Il modulo configparser utilizza per impostazione predefinita. Ciò consente di leggere, modificare, i file di configurazione e quindi di riscrivere nell'ordine originale .

+0

Doh. Utile, ma bisogna aspettare qualche anno prima di poterlo usare in produzione ... – pihentagy

+3

In Python 2.7, puoi 'dalle collezioni importare OrderedDict' e usare' ConfigParser (dict_type = OrderedDict) 'per far sì che il parser usi un dizionario ordinato. Basandomi su una quantità minima di test, penso che questo dovrebbe esserti utile. – eksortso

+2

In Python 2.7 non è necessario farlo eksortso, è l'impostazione predefinita. –

3

No. La libreria ConfigParser scrive le cose nell'ordine hash del dizionario. (Puoi vedere questo se guardi il codice sorgente.) Ci sono sostituzioni per questo modulo che fanno un lavoro migliore.

Vedrò se riesco a trovarne uno e aggiungerlo qui.

http://www.voidspace.org.uk/python/configobj.html#introduction è quello che stavo pensando. Non è una sostituzione drop-in, ma è molto facile da usare.

-1

ConfigParser si basa sul formato di file ini, che nel suo design NON deve essere sensibile all'ordine. Se il formato del file di configurazione è sensibile all'ordine, non è possibile utilizzare ConfigParser. Essa può anche confondere la gente se si dispone di un formato ini-tipo che è sensibile l'ordine delle dichiarazioni ...

+2

È ancora utile che gli elementi vengano visualizzati nello stesso ordine se si esegue il controllo di versione dei risultati e si desidera visualizzare differenze ragionevoli da versione a versione. – Arkady

+0

Ah, giusto. Ho completamente perso il fatto che stavi creando dei file. Colpa mia. È dopotutto configPARSER. ;) –

0

Se si vuole prendere un ulteriore passo avanti rispetto la risposta di Alexander Ljungberg e anche ordinare le sezioni ei contenuti delle sezioni è possibile utilizzare il seguente:

config = ConfigParser.ConfigParser({}, collections.OrderedDict) 
config.read('testfile.ini') 
# Order the content of each section alphabetically 
for section in config._sections: 
    config._sections[section] = collections.OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0])) 

# Order all sections alphabetically 
config._sections = collections.OrderedDict(sorted(config._sections.items(), key=lambda t: t[0])) 

# Write ini file to standard output 
config.write(sys.stdout) 

Questo utilizza OrderdDict dizionari (per mantenere ordinamento) e ordina il file ini di lettura dall'esterno di ConfigParser sovrascrivendo il dizionario _sections interno.

Problemi correlati