목차
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에게 보간이 필요하다는 것을 알린다.
물론 이에 대한 작업은 자동으로 처리된다.
'Development > Python' 카테고리의 다른 글
| [python] GUI programming tkInter (위젯 배치 및 설정) (0) | 2025.08.19 |
|---|---|
| [python] GUI programming tkInter (소개 및 생성) (6) | 2025.08.19 |
| [python] Logging, logging 모듈 (2) | 2025.07.17 |
| [python] CSV, CSV 모듈 (0) | 2025.07.16 |
| [python] XML , XML 문서의 CRUD (0) | 2025.07.15 |