복붙노트

[PYTHON] ConfigParser에서 대소 문자를 보존 하시겠습니까?

PYTHON

ConfigParser에서 대소 문자를 보존 하시겠습니까?

파이썬의 ConfigParser 모듈을 사용하여 설정을 저장하려고했습니다. 내 응용 프로그램의 경우 내 섹션의 각 이름의 대소 문자를 보존해야합니다. ConfigsParser.optionxform ()에 str ()을 전달하면이 작업을 수행 할 수 있다고 나와 있지만 작동하지 않습니다. 이름은 모두 소문자입니다. 내가 놓친 게 있니?

<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz

내가 얻은 것에 대한 파이썬 의사 코드 :

import ConfigParser,os

def get_config():
   config = ConfigParser.ConfigParser()
   config.optionxform(str())
    try:
        config.read(os.path.expanduser('~/.myrc'))
        return config
    except Exception, e:
        log.error(e)

c = get_config()  
print c.options('rules')
[('monkey', 'foo'), ('ferret', 'baz')]

해결법

  1. ==============================

    1.설명서가 혼란 스럽습니다. 이것이 의미하는 바는 다음과 같습니다.

    설명서가 혼란 스럽습니다. 이것이 의미하는 바는 다음과 같습니다.

    import ConfigParser, os
    def get_config():
        config = ConfigParser.ConfigParser()
        config.optionxform=str
        try:
            config.read(os.path.expanduser('~/.myrc'))
            return config
        except Exception, e:
            log.error(e)
    
    c = get_config()  
    print c.options('rules')
    

    나는. optionxform을 호출하는 대신에 무시하십시오. 서브 클래스 또는 인스턴스에서 재정의를 수행 할 수 있습니다. 재정의 할 때는 함수를 호출하여 함수를 호출하십시오.

    나는 이것을 버그로보고했으며, 그 후에 수정되었다.

  2. ==============================

    2.나를 위해 옵션을 개체를 만든 후 즉시 설정하려면 일한

    나를 위해 옵션을 개체를 만든 후 즉시 설정하려면 일한

    config = ConfigParser.RawConfigParser()
    config.optionxform = str 
    
  3. ==============================

    3.나는이 질문에 답을 얻었지만 어떤 사람들은이 솔루션이 유용하다고 생각할 수 있다고 생각했다. 이 클래스는 기존 ConfigParser 클래스를 쉽게 대체 할 수있는 클래스입니다.

    나는이 질문에 답을 얻었지만 어떤 사람들은이 솔루션이 유용하다고 생각할 수 있다고 생각했다. 이 클래스는 기존 ConfigParser 클래스를 쉽게 대체 할 수있는 클래스입니다.

    @ OozeMeister의 제안을 통합하여 편집 :

    class CaseConfigParser(ConfigParser):
        def optionxform(self, optionstr):
            return optionstr
    

    사용법은 일반 ConfigParser와 동일합니다.

    parser = CaseConfigParser()
    parser.read(something)
    

    따라서 새로운 ConfigParser를 만들 때마다 optionxform을 설정하지 않아도되므로 지루합니다.

  4. ==============================

    4.경고:

    경고:

    ConfigParser에서 기본값을 사용하는 경우 (예 :

    config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})
    

    다음을 사용하여 파서에서 대소 문자를 구분하도록하십시오.

    config.optionxform = str
    

    설정 파일의 모든 옵션은 대소 문자 그대로 유지되지만 FOO_BAZ는 소문자로 변환됩니다.

    기본값도 대소 문자를 유지하게하려면 @icedtrees answer와 같은 서브 클래 싱을 사용하십시오.

    class CaseConfigParser(ConfigParser.SafeConfigParser):
        def optionxform(self, optionstr):
            return optionstr
    
    config = CaseConfigParser({'FOO_BAZ': 'bar'})
    

    이제 FOO_BAZ는 대소 문자를 유지하며 InterpolationMissingOptionError를 가지지 않습니다.

  5. ==============================

    5.코드에 추가하십시오 :

    코드에 추가하십시오 :

    config.optionxform = lambda option: option  # preserve case for letters
    
  6. from https://stackoverflow.com/questions/1611799/preserve-case-in-configparser by cc-by-sa and MIT license