파이썬에서는 다양한 포맷팅 방식을 사용하여 데이터 값을 문자열에 삽입할 수 있습니다. 이는 디버깅, 리포트 생성, 폼 출력 등 다양한 용도로 활용됩니다. 이 글에서는 파이썬의 세 가지 문자열 포맷팅 방식과 데이터 보간 방법을 살펴보겠습니다.
파이썬의 3가지 문자열 포맷팅 방식
- % 연산자 (구방식) - 파이썬 2, 3 모두 지원
- str.format() (신방식) - 파이썬 2.6 이상 지원
- f-string (최신 방식) - 파이썬 3.6 이상 지원, 현재 권장 표준
1. 구방식: % 연산자
오래된 스타일의 문자열 포맷팅은 format_string % data 형태를 가집니다. 포맷 문자열은 보간 시퀀스(interpolation sequences)로 구성됩니다.
주요 포맷 지정자
| 문법 | 설명 |
|---|---|
%s | 문자열 |
%d | 10진 정수 |
%x | 16진 정수 (소문자) |
%o | 8진 정수 |
%f | 고정소수점 실수 |
%e | 지수 표기법 실수 |
%g | 고정소수점 또는 지수 표기 (짧은 쪽 선택) |
%% | 리터럴 % 문자 |
기본 사용 예제
# 정수를 다양한 포맷으로 출력
print('output \nprinting a number in string format %s' % 42)
print('printing a number in string decimal %d' % 42)
print('printing a number in string hexa-int %x' % 42)
print('printing a number in string exponential-float %g' % 42)
출력 결과
printing a number in string format 42
printing a number in string decimal 42
printing a number in string hexa-int 2a
printing a number in string exponential-float 42
문자열과 정수 보간
%s는 문자열을 보간합니다. 문자열 내 % 개수는 뒤에 오는 데이터 항목 수와 일치해야 합니다. 단일 항목은 바로 뒤에, 다중 항목은 튜플로 묶어서 전달합니다.
player = 'Roger Federer'
country = 'Switzerland'
titles = 20
# 다중 값 보간 (튜플 사용)
print('*** Tennis player %s From %s had won %d titles' % (player, country, titles))
# 너비 및 정렬 지정
print('%s' % player) # 기본 출력
print('%5s' % player) # 오른쪽 정렬, 최소 5칸
print('%-7s' % player) # 왼쪽 정렬, 최소 7칸
print('%5.7s' % player) # 최소 5칸, 최대 7문자 출력
출력 결과
*** Tennis player Roger Federer From Switzerland had won 20 titles
Roger Federer
Roger Federer
Roger Federer
Roger F
2. 신방식: str.format() 메서드
파이썬 3.5 이상에서 권장되던 방식으로, format_string.format(data) 구문을 사용합니다. 플레이스홀더 {} 순서대로 인자가 매핑되며, 위치 인자, 키워드 인자, 딕셔너리 언패킹 모두 지원합니다.
다양한 사용 예제
player = 'Roger_Federer'
country = 'Legend'
titles = 20
# 기본 순서대로 매핑
print('Output \n{}'.format(player))
print(' *** Tennis player {} From {} had won {} titles '.format(player, country, titles))
# 위치 인자 (인덱스 지정)
print(' *** Tennis player {1} From {2} had won {0} titles '.format(titles, player, country))
# 키워드 인자 (이름으로 매핑)
print(' *** Tennis player {player} From {country} had won {titles} titles '
.format(player='Roger Federer', country='Legend', titles=20))
# 딕셔너리 언패킹
print(' *** Tennis player {player} From {country} had won {titles} titles '
.format(**{'player': 'Roger Federer', 'country': 'Legend', 'titles': 20}))
# 정렬 지정: <(왼쪽), ^(가운데), >(오른쪽)
print(' *** Tennis player {} From {:<5s} had won {:<5d} titles '.format(player, country, titles))
print(' *** Tennis player {} From {:^10s} had won {:^10d} titles '.format(player, country, titles))
print(' *** Tennis player {} From {:>10s} had won {:>10d} titles '.format(player, country, titles))
출력 결과
Roger_Federer
*** Tennis player Roger_Federer From Legend had won 20 titles
*** Tennis player Roger_Federer From Legend had won 20 titles
*** Tennis player Roger Federer From Legend had won 20 titles
*** Tennis player Roger Federer From Legend had won 20 titles
*** Tennis player Roger_Federer From Legend had won 20 titles
*** Tennis player Roger_Federer From Legend had won 20 titles
*** Tennis player Roger_Federer From Legend had won 20 titles
3. 최신 방식: f-string (Formatted String Literals)
파이썬 3.6에 도입되어 현재 가장 권장되는 방식입니다. 간결하고 가독성이 뛰어나며, 표현식 실행도 가능합니다.
f-string 작성 규칙
- 따옴표 앞에
f또는F접두사 붙이기 - 중괄호
{}안에 변수명 또는 표현식 작성
사용 예제
player = 'Roger_Federer'
country = 'Legend'
titles = 20
# 기본 보간
print(f"Output \n *** Tennis player {player} From {country} had won {titles} titles ")
# 표현식 실행 (산술 연산)
print(f" *** I hope {player} wins another {titles - 10} titles ")
# 포맷 스펙 활용: 대문자 변환, 가운데 정렬 및 채우기 문자 지정
print(f" {'*' * 3} Tennis player {player.upper()} From {country:.^10} had won {titles} titles")
출력 결과
*** Tennis player Roger_Federer From Legend had won 20 titles
*** I hope Roger_Federer wins another 10 titles
*** Tennis player ROGER_FEDERER From ..Legend.. had won 20 titles
실전 예제: 왜 f-string을 써야 하는가?
다음은 테니스 선수 랭킹을 출력하는 예제입니다. 구방식과 f-string의 가독성 차이를 비교해 보세요.
구방식 (%) - 인덱스 1부터 시작하도록 수정 시
titles = [
('federer', 20),
('nadal', 20),
('djokovic', 17),
]
print('Output\n')
for i, (player, title_count) in enumerate(titles):
print('#%d: %-10s = %d' % (
i + 1,
player.title(),
round(title_count)
))
출력 결과
#1: Federer = 20
#2: Nadal = 20
#3: Djokovic = 17
f-string 방식 - 훨씬 직관적
titles = [
('federer', 20),
('nadal', 20),
('djokovic', 17),
]
print('Output\n')
for i, (player, title_count) in enumerate(titles, start=1):
print(f'#{i}: {player.title():<10} = {title_count}')
enumerate(titles, start=1)로 인덱스를 1부터 시작하고, 포맷 스펙을 중괄호 안에 바로 작성해 코드가 훨씬 깔끔합니다.
복잡한 템플릿 비교: 딕셔너리 기반 포맷팅
구방식 (%) - 딕셔너리 사용
old_template = (
' Tennis Legend is %(player)s, '
'%(player)s had won %(titles)s titles, '
'and he is from the country %(country)s.'
)
old_formatted = old_template % {
'player': 'Roger Federer',
'titles': 20,
'country': 'Swiss',
}
print('Output\n' + old_formatted)
신방식 (.format) - 딕셔너리 언패킹
new_template = (
' Tennis Legend is {player}, '
'{player} had won {titles} titles, '
'and he is from the country {country}'
)
new_formatted = new_template.format(
player='Roger Federer',
titles=20,
country='Swiss',
)
print('Output\n' + new_formatted)
f-string 방식 - 변수 직접 참조
player = 'Roger Federer'
titles = 20
country = 'Swiss'
f_formatted = (
f' Tennis Legend is {player}, '
f'{player} had won {titles} titles, '
f'and he is from the country {country}'
)
print('Output\n' + f_formatted)
공통 출력 결과
Tennis Legend is Roger Federer, Roger Federer had won 20 titles, and he is from the country Swiss
f-string은 딕셔너리나 키워드 인자 없이 로컬 변수를 직접 참조하므로, 코드가 가장 간결하고 읽기 쉽습니다. 또한 표현식 평가, 포맷 스펙, 디버깅용 = 지정자(파이썬 3.8+) 등 강력한 기능을 제공합니다.
요약 및 권장사항
- 파이썬 3.6 이상: f-string을 기본으로 사용하세요. 성능, 가독성, 기능 모두 최고입니다.
- str.format(): 레거시 코드 유지보수나, 템플릿을 외부 설정(파일/DB)에서 로드해 동적으로 적용해야 할 때 유용합니다.
- % 연산자: 로깅 모듈(
logging) 등 일부 표준 라이브러리에서 여전히 필요하므로 문법만 숙지하세요.
현대적인 파이썬 코드베이스에서는 f-string을 표준으로 채택하고, 예외적인 경우에만 다른 방식을 혼용하는 것을 권장합니다.