24.2 문자열 서식 지정자와 포매팅 사용하기

파이썬은 다양한 방법으로 문자열을 만들 수 있습니다. 그중에서 서식 지정자(format specifier)로 문자열을 만드는 방법과 format 메서드로 문자열을 만드는 문자열 포매팅(string formatting)에 대해 알아보겠습니다.

예를 들어 학생의 이름과 평균 점수를 출력한다고 하죠.

제임스의 평균 점수는 85.3점입니다.

만약 학생이 바뀐다면 이름과 점수 부분도 바뀌겠죠?

마리아의 평균 점수는 98.7점입니다.

두 문자열에서 '의 평균 점수는', '점입니다.'는 같지만 이름과 점수가 다릅니다. 이렇게 문자열 안에서 특정 부분을 원하는 값으로 바꿀 때 서식 지정자 또는 문자열 포매팅을 사용합니다.

24.2.1  서식 지정자로 문자열 넣기

그럼 서식 지정자(format specifier)로 문자열 중간에 다른 문자열을 넣어보겠습니다.

  • '%s' % '문자열'
>>> 'I am %s.' % 'james'
'I am james.'

서식 지정자는 %로 시작하고 자료형을 뜻하는 문자가 붙습니다. %s는 문자열이라는 뜻이며 string의 s입니다. 이처럼 문자열 안에 %s를 넣고 그 뒤에 %를 붙인 뒤 'james'를 지정해주면 %s 부분이 'james'로 바뀝니다('I am %s.''james' 사이의 %는 따옴표로 묶지 않고 그대로 입력해야 합니다).

물론 문자열을 바로 지정하지 않고 변수를 지정할 수도 있습니다.

>>> name = 'maria'
>>> 'I am %s.' % name
'I am maria.'

24.2.2  서식 지정자로 숫자 넣기

그럼 문자열 안에 숫자는 어떻게 넣을까요?

  • '%d' % 숫자
>>> 'I am %d years old.' % 20
'I am 20 years old.'

숫자는 %d를 넣고 % 뒤에 숫자를 지정하면 됩니다. %d는 10진 정수 decimal integer의 d입니다.

24.2.3  서식 지정자로 소수점 표현하기

숫자 중에 소수점으로 된 실수를 넣어야 할 경우도 있습니다.

  • '%f' % 숫자
>>> '%f' % 2.3
'2.300000'

실수를 넣을 때는 %f를 사용하며 고정 소수점 fixed point의 f입니다. %f는 기본적으로 소수점 이하 6자리까지 표시하므로 2.32.300000으로 표시됩니다.

소수점 이하 자릿수를 지정하고 싶다면 다음과 같이 f 앞에 .(점)과 자릿수를 지정해주면 됩니다.

  • '%.자릿수f' % 숫자
>>> '%.2f' % 2.3
'2.30'
>>> '%.3f' % 2.3
'2.300'

24.2.4  서식 지정자로 문자열 정렬하기

이번에는 서식 지정자와 숫자를 조합하여 문자열을 정렬하는 방법을 알아보겠습니다. 다음과 같이 % 뒤에 숫자를 붙이면 문자열을 지정된 길이로 만든 뒤 오른쪽으로 정렬하고 남는 공간을 공백으로 채웁니다.

  • %길이s
>>> '%10s' % 'python'
'    python'

%10s는 문자열의 길이를 10으로 만든 뒤 지정된 문자열을 넣고 오른쪽으로 정렬합니다. 따라서 문자열 'python'은 길이가 6이므로 왼쪽 공간을 공백 4칸으로 채웁니다.

그림 24-4 문자열 오른쪽 정렬
참고 | 자릿수가 다른 숫자 출력하기

문자열 오른쪽 정렬은 자릿수가 다른 숫자를 출력할 때 유용합니다. %d%f도 숫자와 조합하여 오른쪽으로 정렬할 수 있습니다.

%길이d

>>> '%10d' % 150
'       150'
>>> '%10d' % 15000
'     15000'

실수는 다음과 같이 .(점) 앞에 정렬할 길이를 지정하고, 점 뒤에 소수점 이하 자릿수를 지정합니다.

%길이.자릿수f

>>> '%10.2f' % 2.3
'      2.30'
>>> '%10.2f' % 2000.3
'   2000.30'

그럼 왼쪽 정렬은 어떻게 할까요? 왼쪽 정렬은 문자열 길이에 -를 붙여주면 됩니다.

  • %-길이s
>>> '%-10s' % 'python'
'python    '

%-10s는 문자열의 길이를 10으로 만든 뒤 지정된 문자열을 넣고 왼쪽으로 정렬합니다. 따라서 문자열 'python'은 길이가 6이므로 오른쪽 공간을 공백 4칸으로 채웁니다.

그림 24-5 문자열 왼쪽 정렬

24.2.5  서식 지정자로 문자열 안에 값 여러 개 넣기

지금까지 문자열 안에 값을 한 개만 넣었는데, 값을 여러 개 넣으려면 어떻게 해야 할까요?

문자열 안에 값을 두 개 이상 넣으려면 %를 붙이고, 괄호 안에 값(변수)을 콤마로 구분해서 넣어주면 됩니다. 특히 값을 괄호로 묶지 않으면 에러가 발생하므로 주의해야 합니다.

  • '%d %s' % (숫자, '문자열')
>>> 'Today is %d %s.' % (3, 'April')
'Today is 3 April.'

여기서는 서식 지정자가 두 개이므로 값도 두 개 넣었습니다. 이처럼 서식 지정자가 여러 개면 괄호 안의 값(변수) 개수도 서식 지정자 개수와 똑같이 맞춰주어야 합니다.

지금까지 서식 지정자 사이를 공백으로 띄웠습니다. 만약 서식 지정자를 서로 붙이면 결과도 붙어서 나오므로 주의해야 합니다. 다음은 3'April'이 붙어서 3April로 나옵니다.

>>> 'Today is %d%s.' % (3, 'April')
'Today is 3April.'

24.2.6  format 메서드 사용하기

파이썬은 문자열을 만들 때 서식 지정자 방식보다 더 간단한 문자열 포매팅(string formatting)을 제공합니다. 문자열 포매팅은 { }(중괄호) 안에 포매팅을 지정하고 format 메서드로 값을 넣습니다.

  • '{인덱스}'.format(값)
>>> 'Hello, {0}'.format('world!')
'Hello, world!'
>>> 'Hello, {0}'.format(100)
'Hello, 100'

이렇게 문자열 안에 { }를 넣고 인덱스를 지정합니다. 그리고 format에는 { } 부분에 넣을 값을 지정하면 됩니다.

24.2.7  format 메서드로 값을 여러 개 넣기

이번에는 값을 여러 개 넣어보겠습니다. 인덱스의 순서와 format에 지정된 값의 순서를 주목해주세요.

>>> 'Hello, {0} {2} {1}'.format('Python', 'Script', 3.6)
'Hello, Python 3.6 Script'

{ }에 인덱스를 지정한 뒤 format에는 인덱스가 증가하는 순서대로 값을 넣으면 됩니다. 여기서는 {0} {2} {1}처럼 인덱스 순서를 섞었고 format에는 'Python', 'Script', 3.6 순으로 넣었습니다. 따라서 문자열에는 인덱스 숫자에 해당하는 값이 들어가서 'Hello, Python 3.6 Script'가 나옵니다.

그림 24-6 format과 인덱스

24.2.8  format 메서드로 같은 값을 여러 개 넣기

특히 같은 인덱스가 지정된 { }를 여러 개 넣으면 같은 값이 여러 개 들어갑니다. 다음은 문자열에 'Python'이 두 개, 'Script'가 두 개 들어갑니다.

>>> '{0} {0} {1} {1}'.format('Python', 'Script')
'Python Python Script Script'

24.2.9  format 메서드에서 인덱스 생략하기

만약 { }에서 인덱스를 생략하면 format에 지정한 순서대로 값이 들어갑니다.

>>> 'Hello, {} {} {}'.format('Python', 'Script', 3.6)
'Hello, Python Script 3.6'

24.2.10                format 메서드에서 인덱스 대신 이름 지정하기

{ }에 인덱스로 순서를 지정하려니 조금 헷갈리죠? { }에 인덱스 대신 이름을 지정할 수도 있습니다.

>>> 'Hello, {language} {version}'.format(language='Python', version=3.6)
'Hello, Python 3.6'

{language}{version}처럼 { }에 이름을 지정했습니다. format에는 format(language='Python', version=3.6)과 같이 이름에 해당하는 값을 지정해주면 됩니다.

24.2.11                문자열 포매팅에 변수를 그대로 사용하기

파이썬 3.6부터는 문자열을 만드는 더 간단한 방법을 제공합니다. 다음과 같이 변수에 값을 넣고 { }에 변수 이름을 지정하면 됩니다. 이때는 문자열 앞에 포매팅(formatting)이라는 뜻으로 f를 붙입니다.

>>> language = 'Python'
>>> version = 3.6
>>> f'Hello, {language} {version}'
'Hello, Python 3.6'
참고 | 중괄호 출력하기

{ } 중괄호 자체를 출력할 때는 {{, }}처럼 중괄호를 두 번 사용하면 됩니다.

>>> '{{ {0} }}'.format('Python')
'{ Python }'

24.2.12                format 메서드로 문자열 정렬하기

지금까지 문자열의 서식 지정자나 ljust, rjust, center로 정렬을 했죠? 문자열 포매팅도 문자열을 정렬할 수 있습니다. 다음과 같이 인덱스 뒤에 :(콜론)을 붙이고 정렬할 방향과 길이를 지정해주면 됩니다.

  • '{인덱스:<길이}'.format(값)
>>> '{0:<10}'.format('python')
'python    '

'{0:<10}'은 부등호 방향이 왼쪽을 가리키고 있죠? 그래서 문자열을 지정된 길이로 만든 뒤 왼쪽으로 정렬하고 남는 공간을 공백으로 채웁니다.

그림 24-7 format으로 왼쪽 정렬

다음과 같이 >을 넣어서 오른쪽을 가리키도록 만들면 문자열을 지정된 길이로 만든 뒤 오른쪽으로 정렬하고 남는 공간을 공백으로 채웁니다.

  • '{인덱스:>길이}'.format(값)
>>> '{0:>10}'.format('python')
'    python'
그림 24-8 format으로 오른쪽 정렬

참고로 인덱스를 사용하지 않는다면 :(콜론)과 정렬 방법만 지정해도 됩니다.

>>> '{:>10}'.format('python')
'    python'

24.2.13                숫자 개수 맞추기

그럼 이번에는 정수와 실수 앞에 0을 넣어서 숫자 개수를 맞추는 방법을 알아보겠습니다.

%d는 다음과 같이 %d 사이에 0과 숫자 개수를 넣어주면 자릿수에 맞춰서 앞에 0이 들어갑니다. 즉, %03d로 지정하면 1'001', 35'035'가 됩니다. { }를 사용할 때는 인덱스나 이름 뒤에 :(콜론)를 붙이고 03d처럼 0과 숫자 개수를 지정하면 됩니다.

  • '%0개수d' % 숫자
  • '{인덱스:0개수d'}'.format(숫자)
>>> '%03d' % 1
'001'
>>> '{0:03d}'.format(35)
'035'

물론 실수도 숫자 개수를 맞출 수 있습니다. 특히 소수점 이하 자릿수를 지정하고 싶으면 %08.2f처럼 .(점) 뒤에 자릿수를 지정해줍니다.

  • '%0개수.자릿수f' % 숫자
  • '{인덱스:0개수.자릿수f'}.format(숫자)
>>> '%08.2f' % 3.6
'00003.60'
>>> '{0:08.2f}'.format(150.37)
'00150.37'

여기서 주의할 점은 '%08.2f' % 3.6을 출력했을 때 '00003.60'이 나온다는 점입니다. 잘 보면 3 앞에 0이 7개가 아니라 4개만 붙어 있습니다. 실수는 숫자 개수에 정수 부분, 소수점, 소수점 이하 자릿수가 모두 포함됩니다. 따라서 '00003' 5개, '.' 1개, '60' 2개 총 8개입니다.

그림 24-9 실수는 정수, 소수점, 소수점 이하 자릿수가 모두 포함됨

24.2.14                채우기와 정렬을 조합해서 사용하기

문자열 포매팅은 채우기와 정렬을 조합해서 사용할 수 있습니다. 다음과 같이 { }에 인덱스, 채우기, 정렬, 길이, 자릿수, 자료형 순으로 지정해줍니다.

  • '{인덱스:[[채우기]정렬][길이][.자릿수][자료형]}'

그럼 길이를 10으로 만든 뒤 왼쪽, 오른쪽으로 정렬하고 남는 공간은 0으로 채워보겠습니다.

>>> '{0:0<10}'.format(15)    # 길이 10, 왼쪽으로 정렬하고 남는 공간은 0으로 채움
'1500000000'
>>> '{0:0>10}'.format(15)    # 길이 10, 오른쪽으로 정렬하고 남는 공간은 0으로 채움
'0000000015'

물론 실수로 만들고 싶다면 다음과 같이 소수점 자릿수와 실수 자료형 f를 지정해주면 됩니다.

>>> '{0:0>10.2f}'.format(15)    # 길이 10, 오른쪽으로 정렬하고 소수점 자릿수는 2자리
'0000015.00'

특히 채우기 부분에 0이 아닌 다른 문자를 넣어도 됩니다. 공백을 넣어도 되고, 문자를 넣어도 됩니다. 만약 채우기 부분을 생략하면 공백이 들어갑니다.

>>> '{0: >10}'.format(15)    # 남는 공간을 공백으로 채움
'        15'
>>> '{0:>10}'.format(15)     # 채우기 부분을 생략하면 공백이 들어감
'        15'
>>> '{0:x>10}'.format(15)    # 남는 공간을 문자 x로 채움
'xxxxxxxx15'

문자열 메서드와 서식 지정자, 문자열 포매팅은 분량이 많지만 필요한 부분만 익혀서 사용하면 되고 모두 외우지 않아도 됩니다. 이 부분은 파이썬을 사용하다 보면 자연스럽게 익히게 됩니다.

참고 | 금액에서 천단위로 콤마 넣기

숫자 중에서 금액은 천단위로 ,(콤마)를 넣죠? 파이썬에서는 간단하게 천단위로 콤마를 넣을 수 있습니다.

먼저 format 내장 함수를 사용하는 방법입니다. 다음과 같이 format 함수에 숫자와 ','를 넣어줍니다.

format(숫자, ',')

>>> format(1493500, ',')
'1,493,500'

format 함수는 서식 지정자와 함께 사용할 수 있습니다. 다음은 콤마를 넣은 숫자를 오른쪽 정렬합니다.

>>> '%20s' % format(1493500, ',')    # 길이 20, 오른쪽으로 정렬
'           1,493,500'

포매팅에서 콤마를 넣으려면 다음과 같이 :(콜론)뒤에 ,(콤마)를 지정하면 됩니다.

>>> '{0:,}'.format(1493500)
'1,493,500'

만약 정렬을 하고 싶다면 정렬 방향과 길이 뒤에 콤마를 지정해줍니다.

>>> '{0:>20,}'.format(1493500)     # 길이 20, 오른쪽으로 정렬
'           1,493,500'
>>> '{0:0>20,}'.format(1493500)    # 길이 20, 오른쪽으로 정렬하고 남는 공간은 0으로 채움
'000000000001,493,500'