파이썬 미니포맷(format()) 사용법

우리는 값을 출력할 때 print() 함수를 사용한다. (python2에서 print는 구문이었지만, python3에서는 함수로 바뀌었다.) print() 함수는 전달 받은 인자를 문자열로 변환하여 표준 출력을 통해서 해당 문자열을 내보낸다. 만약 print(1)이라고 하면 정수 객체를 표현하는 문자열인 "1"을 생성하여 이것을 출력하는 것이다.

하지만 경우에 따라서는 출력되는 값이 이런 저런 양념을 넣어야 할 때가 있다. 고정된 폭에 맞추어 출력하거나 숫자값의 경우에는 세자리마다 콤마를 넣거나 소수점 자리수를 한정해야 할 때도 있다. 공학 계산의 결과를 출력할 때에는 유효숫자의 자리수 만큼 값을 표시하기 위한 서식을 적용해야 할 때도 있다.

고전적으로 파이썬에서는 % 문자를 사용하여 서식 문자열에 값을 입력하는 문자열 내삽(interpolation)을 지원했다. (이것은 꼭 파이썬만의 기준이 아니라 여러 언어에서 공통적으로 사용하는 표준 규격이었다.) 한동안 이 내삽 기능을 잘 사용해왔지만, 경우에 따라 부족한 기능들이 있어서 이를 확장하는 방법이 요구되었고 이러한 요구에 부응하기 위해 값을 삽입하고 서식화하는 기능을 확장하여 파이썬 문자열은 format()이라는 메소드를 추가로 갖게 되었다.

이 글은 format() 메소드 (혹은 string.format() 함수)에서 사용되는 서식 지정자 (format identifier)에 대한 설명이다. 파이썬에서는 이 문법을 ‘미니포맷’이라고도 한다. 미니 포맷에 대한 전체 설명은 아래 링크에서 확인할 수 있다.

https://docs.python.org/ko/3/library/string.html#formatstrings


미니포맷 스팩은 다음과 같이 이루어진다.

"{identifier: 채움문자+정렬+부호+폭+그룹+정밀도+숫자표시형식}"
  • * 채움문자 (정렬 플래그가 있는 경우에만 쓸 수 있다.)
  • * 정렬 : <, >, ^, =
  • * 부호 : +, -, (공백을 쓰는 경우, 부호 위치를 공백으로)
  • * 폭 : 해당 값이 차지하는 폭, 남는 경우 채움문자를 사용한다.
  • * 그룹옵션 : 천 단위 숫자에 , 또는 _ 를 사용하게 한다.
  • * 정밀도옵션 : 소수점 이하로 표시할 범위 (정밀도 표시는 전체 폭 내에서 조절)
  • * 숫자표시형식
    • b : 이진법으로 숫자 출력
    • c : 정수값을 유니코드 문자로 변환 ({:c}.format(65) --> 'A')
    • d, o, x, X : 각각 10, 8, 16진법으로 변환. X는 문자를 대문자로 표현한다.
    • f, F : 고정 소수점 표기법 (.2f 등으로 소수점 뒷자리를 명시한다.)
    • e, E : 지수 표기법
    • n, g, G : 유효숫자의 표기법. e, f는 소수점 이하 자리 수를 정의하지만, g는 유효숫자의 개수를 유지한다.
    • % : 100을 곱해서 %로 환산하여 표기한다.

이 미니 포맷언어는 파이썬 3.7부터 f"..." 문법으로도 사용할 수 있게 되어 있다. 또한 이 때에는 미니 포맷을 중첩하여 사용하는 것도 지원한다.


기본적으로 많이 쓰는 부분은 폭과 정밀도 부분이다. : 바로 뒤에 숫자를 넣으면 폭을 지정한다. 만약 폭이 콘텐츠 길이보다 짧으면 무시된다. 정수/실수값의 경우에는 큰 폭을 지정하면 오른쪽으로 정렬된다. 아래 예제는 'abc'라는 문자열과 123이라는 정수값을 20자 폭 공간으로 맞춤한 예이다.

>>> '{:20}'.format('abc')
'abc                 '

>>> '{:20}'.format(123)
'                 123'

폭이 있는 경우, 정렬방법을 강제로 지정할 수 있다. 왼쪽, 오른쪽도 가능하며 가운데 정렬도 지원한다.

>>> '{:20}'.format('abc')
'abc                 '

>>> '{:>20}'.format('abc')
'                 abc'

>>> '{:^20}'.format('abc')
'        abc         '

정렬을 하게되면 반대쪽은 기본적으로 공백문자로 채워진다. 이때 정렬 플래그앞에 채움문자를 따로 지정해서 해당 문자로 채워지도록 할 수 있다.

>>> '{:_>20}'.format('abc')
'_________________abc'

>>> '{:.^20}'.format(123)
'........123.........'

채움문자를 쓸 때 정렬 플래그없이 {:#20}과 같이 쓰면 오류가 난다. 채움문자는 반드시 정렬 플래그와 함께 써야 한다.

정렬 플래그와 폭 사이에는 부호 플래그를 쓸 수 있다. 부호는 숫자값에만 적용할 수 있다. 생략하면 기본적으로 -와 같이 동작한다. 공백을 사용하면, -일 때에만 부호를 표시하지만, 양수값일 때에는 빈칸으로 – 자리를 비워둔다.

# `#`를 채움문자로 쓰면서 부호란을 비워둔다.
>>> '{:#> 20}'.format(123)
'################ 123'

# 부호를 항상 표시한다.
>>> '{:#>+20}'.format(123)
'################+123'

# 부호를 음수일 때에만 표시한다.
>>> '{:#>-20}'.format(123)
'#################123'

>>> '{:#>-20}'.format(-123)
'################-123'

폭 뒤에 ,를 써서 숫자에 콤마를 넣을 수 있다. 기본적으로 3자리마다 들어간다. , 대신에 _를 쓸 수 있다. 자리수 조정은 불가능하다. 참고로 파이썬에서는 숫자 사이의 _를 무시하고 인식할 수 있다. 긴자리 숫자를 쓸 때 컴마 대신 쓰면 편리하다.

>>> '{:>-20,}'.format(-12345)
'             -12,345'

>>> '{:>-20_}'.format(-12345)
'             -12_345'

폭 뒤에 .숫자를 쓰면 실수값의 경우 정밀도를 표현할 수 있다. 이 때 실수에 대해서는 표시 포맷을 특정해야 한다. 왜냐하면 이 ‘정밀도’가 해석되는 방식이 다르기 때문이다. 보통 .3f와 같은 식으로 쓰면 소수점 3자리까지 표시한다. 이 때 4째자리에서 반올림하여 표시한다. e, f의 경우에는 소수점 아래까지 표시할 숫자의 개수를 지정한다. g를 사용하면 숫자 맨 앞에서부터의 유효숫자를 의미한다.

>>> '{:-10.3f}'.format(-123.4567)
'  -123.457'

>>> '{:-10.3e}'.format(-123.4567)
'-1.235e+02'

>>> '{:-10.2g}'.format(-123.4567)
'  -1.2e+02'

포맷에 %를 쓰면 *100 하고, 지정된 정밀도까지 표시한다.

>>> '{:-10.2%}'.format(-123.4567)
'-12345.67%'

미니 포맷을 이용하면 %문자를 사용한 내삽보다 깔끔하고 유연한 처리를 할 수 있다. 예를 들어 구구단을 출력하는 포맷을 깔끔하게 만들고 싶다면 다음과 같이 쓸 수 있다. (파이썬 3.7 이상 기준) 이렇게 쓰면 결과부분이 깔끔하게 오른쪽으로 정렬되어 자리수가 맞춰서 출력된다.

for y in range(2, 10):
  print(f'{2} x {y} = {2*y:2}')

2 * 2 =  4
2 * 3 =  6
2 * 4 =  8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18