[python] configparser 모듈
A A

목차

    728x90

     

    configparser

    애플리케이션에서 사용할 수 있는 API를 인기 많은 서비스들이 제공하고 있다.

    이럴 때 서비스를 통합하기 위해 로그인 및 비밀번호 같은 데이터나 액세스 토큰을 사용한 인증이 필요하다.

    각 서비스마다 인증에 필요한 데이터가 다를 수 있지만, 한가지 확실한 사실은 애플리케이션 어딘가에 데이터를 저장해야한다는 것이다.

    코드를 하드코딩하지 않고, configparser모듈을 통해 구성 파일을 사용하는 것이다.

    configparser 모듈은 파이썬 표준 라이브러리로 install 할 필요 없이 import 하여 사용이 가능하다.

     

    1. configparser 가져오기

    import configparser

     

    일단 구성 데이터를 읽기 전, 데이터가 저장된 파일의 구조를 먼저 알아야한다.

     

     

    2. 구성 파일은 어떻게 생겼을까 ?

    [ default_section ] 
    키 = 값 
    키 = 값 
    ...
    
    [ section_1 ] 
    키 = 값 
    키 = 값 
    ...
    
    [ section_2 ] 
    키 = 값 
    키 = 값 
    ...

    구성파일의 구조는 Microsoft Window INI 파일과 유사하다.

    대괄호로 묶인 이름으로 구별되는 섹션으로 구성된다.

    섹션에는 키와 값으로 구성된 항목이 포함되어 있고(양 끝의 공백은 제거됨),

    각 쌍은 콜론(:)이나 등호(=)로 구분된다.

    구성파일은 세미콜론(;)이나 해쉬(#)로 오는 주석이 포함될 수 있다.

     

    [DEFAULT]
    host = localhost # This is a comment.
    
    [mariadb]
    name = joy
    user = user1
    password = password
    
    [redis]
    port = 6379
    db = 0

    DEFAULT, mariadb, redis 섹션이 포함되어 있다.

     

    [DEFAULT] : 파일의 다른 섹션에서 읽을 수 있는 기본값을 포함한다. 현재의 경우 모든 섹션에 공통된 호스트가 있다.

    [mariadb] : MariaDB 연결에 필요한 데이터를 저장한다. 현재의 경우 DB 이름, 사용자 이름, 비밀번호를  가지고 있다.

    [redis] : 포트와 데이터베이스 번호로 구성된 redis 구성 데이터를 가지고 있다.

     

    3. 구성파일 읽기

    • ConfigParser 객체의 read() 메서드
    import configparser
    
    config = configparser.ConfigParser()
    data = config.read('config.ini')
    print('='*30)
    print(data)
    ==============================
    ['config.ini']

    read() 메서드를 사용하면 문자열의 리스트 형태로 해당 파일의 이름이 출력되고, 해당 ConfigParser 객체는 파일을 읽어드린다.

     

    • ConfigParser 객체를 딕셔너리 처럼 접근하기.
    import configparser
    
    config = configparser.ConfigParser()
    data = config.read('config.ini')
    print('='*30)
    print(data)
    print('='*30)
    print('section : ', config.sections())
    print('='*30)
    print('[DEFAULT]host : ', config['DEFAULT']['host'])
    print()
    print('[DB]name : ', config['mariadb']['name'])
    print('[DB]user : ', config['mariadb']['user'])
    print()
    print('[REDIS]host : ', config.get('redis','host'))
    print('[REDIS]port : ', int(config.get('redis', 'port')))
    print('[REDIS]db : ', config.get('redis', 'db'))
    print('='*30)
    ==============================
    ['config.ini']
    ==============================
    section : ['mariadb', 'redis']
    ==============================
    [DEFAULT]host : localhost # This is a comment.

    [DB]name : joy
    [DB]user : user1

    [REDIS]host : localhost # This is a comment.
    [REDIS]port : 6379
    [REDIS]db : 0
    ==============================

    sections를 통해 DEFAULT를 제외한 섹션들의 이름 리스트를 볼 수 있다.

    구성 파일에 접근하기 위한 방식은 딕셔너리를 사용하는 방식과 유사하다.

    섹션의 이름은 대소문자를 구분하지만, 접근하기 위한 키는 대소문자를 구분하지 않는다.

     

    DEFAULT는 sections에 포함되지 않았지만 접근이 가능한 것을 예제 코드를 통해 확인할 수 있다.

    get() 메서드를 통해 값을 가져오거나, 키값을 통해 가져온다.

     

    그리고 마지막에 config.get('redis', 'host') 를 보면

    redis는 host를 가지고 있지 않지만 DEFAULT 설정한 키값에 접근이 가능한 것을 확인할 수 있다.

     

    • ConfigParser 객체의 read_dict() 메서드
    import configparser
    
    config = configparser.ConfigParser()
    data_dict = {
        'DEFAULT' : {
            'host' : 'localhost'
        },
        'mariadb' : {
            'name' : 'joy',
            'user' : 'user1',
            'password' : 'password'
        },
        'redis' : {
            'port' : '6379',
            'db' : '0'
        }
    }
    config.read_dict(data_dict)
    
    
    print('='*30)
    print(data_dict)
    print('='*30)
    print('section : ', config.sections())
    print('='*30)
    print('[DEFAULT]host : ', config['DEFAULT']['host'])
    print()
    print('[DB]name : ', config['mariadb']['name'])
    print('[DB]user : ', config['mariadb']['user'])
    print()
    print('[REDIS]host : ', config.get('redis','host'))
    print('[REDIS]port : ', int(config.get('redis', 'port')))
    print('[REDIS]db : ', config.get('redis', 'db'))
    print('='*30)

    파이썬의 객체를 ConfigParser 객체가 읽어 구성을 다루게 된다.

    딕셔너리에 있는 모든 값은 문자열로 변환된다.

     

    configparser 모듈에는 열린 파일이나 문자열에서도 구성을 읽을 수 있는 메서드(read_file, read_string)들이 있다.

     

    4. 구성 파일 생성

    import configparser
    
    config = configparser.ConfigParser()
    config['DEFAULT'] = {'host': 'localhost'}
    config['mariadb'] = {'name': 'joy', 'user': 'user1', 'password': 'password'}
    config['redis'] = {'port': '6379', 'db': '0'}
    
    with open('config_create.ini', 'w') as config_file:
        config.write(config_file)

    open 함수를 이용하여 config.write() 메서드를 사용한다.

     

     

    5. 구성 파일 수정

    import configparser
    
    config = configparser.ConfigParser()
    config.read('config_create.ini')
    print('변경 전 user :', config['mariadb']['user'])
    config['mariadb']['user'] = 'user2'
    
    with open('config_create.ini', 'w') as config_file:
        config.write(config_file)
    
    config.read('config_create.ini')
    print('변경 후 user :', config['mariadb']['user'])
    변경 전 user : user1
    변경 후 user : user2

    read()메서드를 통해 읽은 후, 딕셔너리와 같이 접근하여 값을 수정한 후 w 모드로 작성하면 수정이 된다.

     

    6. 구성 파일의 장점

    구성 파일의 가장 큰 장점은 보간(interpolation)을 사용할 수 있다는 점이다.

    보간을 사용하면 적절한 값으로 대체될 자리 표시자를 포함하는 표현식을 만들 수 있다.

    보간(interpolation)
    언뜻 보관과 비슷한 말과 단어 같지만,
    알려진 데이터 값들을 기반으로 그 사이의 값을 추정하거나 예측하는 과정을 의미하는데,
    즉, 주어진 데이터 포인트 사이의 빈 공간을 채워 넣는다고 생각할 수 있다.

     

    %%writefile config_interpolation.ini
    [DEFAULT]
    host = localhost
    
    [mariadb]
    name = joy
    user = user1
    password = password
    
    [redis]
    port = 6379
    db = 0
    dsn = redis://%(host)s
    import configparser
    
    config = configparser.ConfigParser()
    config.read('config_interpolation.ini')
    
    print(config.get('redis', 'dsn'))
    redis://localhost

     

    %(host)s 자리표시자를 활용하여 적절한 값으로 대체되었다.

    %와 s 사이에 키를 넣으면 parser에게 보간이 필요하다는 것을 알린다.

    물론 이에 대한 작업은 자동으로 처리된다.

    Copyright 2024. GRAVITY all rights reserved