우리는 값을 출력할 때 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