Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 데이터 값을 문자열로 보간(Interpolation)하는 방법

파이썬에서는 다양한 포맷팅 방식을 사용하여 데이터 값을 문자열에 삽입할 수 있습니다. 이는 디버깅, 리포트 생성, 폼 출력 등 다양한 용도로 활용됩니다. 이 글에서는 파이썬의 세 가지 문자열 포맷팅 방식과 데이터 보간 방법을 살펴보겠습니다.

파이썬의 3가지 문자열 포맷팅 방식

  • % 연산자 (구방식) - 파이썬 2, 3 모두 지원
  • str.format() (신방식) - 파이썬 2.6 이상 지원
  • f-string (최신 방식) - 파이썬 3.6 이상 지원, 현재 권장 표준

1. 구방식: % 연산자

오래된 스타일의 문자열 포맷팅은 format_string % data 형태를 가집니다. 포맷 문자열은 보간 시퀀스(interpolation sequences)로 구성됩니다.

주요 포맷 지정자

문법설명
%s문자열
%d10진 정수
%x16진 정수 (소문자)
%o8진 정수
%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 작성 규칙

  1. 따옴표 앞에 f 또는 F 접두사 붙이기
  2. 중괄호 {} 안에 변수명 또는 표현식 작성

사용 예제

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을 표준으로 채택하고, 예외적인 경우에만 다른 방식을 혼용하는 것을 권장합니다.