not - python write configparser




Elenchi in ConfigParser (7)

Il tipico file generato da ConfigParser ha il seguente aspetto:

[Section]
bar=foo
[Section 2]
bar2= baz

Ora, c'è un modo per indicizzare liste come, ad esempio:

[Section 3]
barList={
    item1,
    item2
}

Domanda correlata: chiavi uniche di Python per ConfigParser per sezione


Anche un po 'tardi, ma forse utile per alcuni. Sto usando una combinazione di ConfigParser e JSON:

[Foo]
fibs: [1,1,2,3,5,8,13]

basta leggerlo con:

>>> json.loads(config.get("Foo","fibs"))
[1, 1, 2, 3, 5, 8, 13]

Puoi persino interrompere le linee se la tua lista è lunga (grazie a @ peter-smit):

[Bar]
files_to_check = [
     "/path/to/file1",
     "/path/to/file2",
     "/path/to/another file with space in the name"
     ]

Ovviamente potrei semplicemente usare JSON, ma trovo i file di configurazione molto più leggibili e la sezione [DEFAULT] è molto utile.


Arriva tardi a questa festa, ma di recente l'ho implementata con una sezione dedicata in un file di configurazione per un elenco:

[paths]
path1           = /some/path/
path2           = /another/path/
...

e usando config.items( "paths" ) per ottenere un elenco iterabile di elementi del percorso, in questo modo:

path_items = config.items( "paths" )
for key, path in path_items:
    #do something with path

Spero che questo aiuti altre persone a cercare su Google questa domanda;)


Non vi è nulla che ti impedisce di impacchettare la lista in una stringa delimitata e quindi di decomprimerla una volta ottenuta la stringa dalla config. Se lo hai fatto in questo modo la tua sezione di configurazione sarebbe:

[Section 3]
barList=item1,item2

Non è bello ma è funzionale per la maggior parte delle liste semplici.


Questo è quello che uso per le liste:

contenuto del file di configurazione:

[sect]
alist = a
        b
        c

codice :

l = config.get('sect', 'alist').split('\n')

funziona per le stringhe

in caso di numeri

contenuto di configurazione:

nlist = 1
        2
        3

codice:

nl = config.get('sect', 'alist').split('\n')
l = [int(nl) for x in nl]

Grazie.


Solo i tipi primitivi sono supportati per la serializzazione dal parser di configurazione. Vorrei usare JSON o YAML per questo tipo di esigenza.


Sono atterrato qui cercando di consumare questo ...

[global]
spys = [email protected], [email protected]

La risposta è dividerla sulla virgola e spogliare gli spazi:

SPYS = [e.strip() for e in parser.get('global', 'spys').split(',')]

Per ottenere un risultato di lista:

['[email protected]', '[email protected]']

Potrebbe non rispondere esattamente alla domanda dell'OP ma potrebbe essere la risposta semplice che alcune persone stanno cercando.


import ConfigParser
import os

class Parser(object):
    """attributes may need additional manipulation"""
    def __init__(self, section):
        """section to retun all options on, formatted as an object
        transforms all comma-delimited options to lists
        comma-delimited lists with colons are transformed to dicts
        dicts will have values expressed as lists, no matter the length
        """
        c = ConfigParser.RawConfigParser()
        c.read(os.path.join(os.path.dirname(__file__), 'config.cfg'))

        self.section_name = section

        self.__dict__.update({k:v for k, v in c.items(section)})

        #transform all ',' into lists, all ':' into dicts
        for key, value in self.__dict__.items():
            if value.find(':') > 0:
                #dict
                vals = value.split(',')
                dicts = [{k:v} for k, v in [d.split(':') for d in vals]]
                merged = {}
                for d in dicts:
                    for k, v in d.items():
                        merged.setdefault(k, []).append(v)
                self.__dict__[key] = merged
            elif value.find(',') > 0:
                #list
                self.__dict__[key] = value.split(',')

Così ora il mio file config.cfg , che potrebbe assomigliare a questo:

[server]
credentials=username:admin,password:$3<r3t
loggingdirs=/tmp/logs,~/logs,/var/lib/www/logs
timeoutwait=15

Può essere analizzato in oggetti a grana fine per il mio piccolo progetto.

>>> import config
>>> my_server = config.Parser('server')
>>> my_server.credentials
{'username': ['admin'], 'password', ['$3<r3t']}
>>> my_server.loggingdirs:
['/tmp/logs', '~/logs', '/var/lib/www/logs']
>>> my_server.timeoutwait
'15'

Questo è per l'analisi molto veloce di semplici configurazioni, si perde tutta la capacità di recuperare int, bool e altri tipi di output senza trasformare l'oggetto restituito da Parser , o rifare il lavoro di parsing eseguito dalla classe Parser altrove.





configparser