2013-10-14 11 views
41

Ho trovato un'osservazione interessante. Avevo scritto un programma di leggere file di configurazione come,ConfigParser legge le maiuscole e le fa in lettere minuscole

import ConfigParser 
class ConfReader(object): 
    ConfMap = dict() 

    def __init__(self): 
     self.config = ConfigParser.ConfigParser() 
     self.config.read('./Config.ini') 
     self.__loadConfigMap() 

    def __loadConfigMap(self): 
     for sec in self.config.sections(): 
      for key,value in self.config.items(sec): 
       print 'key = ', key, 'Value = ', value 
       keyDict = str(sec) + '_' + str(key) 
       print 'keyDict = ' + keyDict 
       self.ConfMap[keyDict] = value 

    def getValue(self, key): 
     value = '' 
     try: 
      print ' Key = ', key 
      value = self.ConfMap[key] 
     except KeyError as KE: 
      print 'Key', KE , ' didn\'t found in configuration.' 
    return value 

class MyConfReader(object): 
    objConfReader = ConfReader() 

def main(): 
    print MyConfReader().objConfReader.getValue('DB2.poolsize') 
    print MyConfReader().objConfReader.getValue('DB_NAME') 

if __name__=='__main__': 
    main() 

E il mio file config.ini assomiglia,

[DB] 
HOST_NAME=localhost 
NAME=temp 
USER_NAME=postgres 
PASSWORD=mandy 

Il __loadConfigMap() funziona bene. Ma leggendo la chiave e i valori, sta rendendo le chiavi minuscole. Non ho capito il motivo. Qualcuno può spiegare perché è così?

+0

Possibile duplicato di [Preserve case in ConfigParser?] (Https://stackoverflow.com/questions/1611799/preserve-case-in-configparser) –

risposta

76

ConfigParser.ConfigParser() è una sottoclasse di ConfigParser.RawConfigParser(), che è documentata a comportarsi in questo modo:

Tutti i nomi delle opzioni sono passati attraverso il metodo optionxform(). L'implementazione predefinita converte i nomi delle opzioni in lettere minuscole.

Ecco perché questo modulo analizza i file Windows INI che devono essere analizzati senza distinzione tra maiuscole e minuscole.

È possibile disattivare questo comportamento sostituendo il RawConfigParser.optionxform() function:

self.config = ConfigParser.ConfigParser() 
self.config.optionxform = str 

str passa attraverso le opzioni invariate.

+0

@Martijin significa che è necessario sostituire il codice di ConfigParser.RawConfigParser (). Bene, grazie per la spiegazione. Per me va bene. – Mandy

+1

Grazie per aver spiegato ** perché ** 'ConfigParser' sta convertendo le chiavi in ​​lettere minuscole. – abaumg

+0

Con questa opzione, vedo che le MAIUSCOLE sono conservate per le chiavi. Nel mio file ini non ho spazi tra la chiave e il valore. Ma il parser di configurazione aggiunge uno spazio prima e dopo uguale a. Ad esempio: se ho KEY = value nel mio file ini, è cambiato in KEY = value. C'è qualche opzione per evitare questi spazi extra? – sridhar249

Problemi correlati