#3. 파이썬 기본 3 - 문자열 포맷팅
- PIA team
- 2022년 2월 1일
- 5분 분량

#3-1. 문자열 포맷팅(Formatting)이란?
"현재 시각은 15시입니다."
"현재 시각은 16시입니다."
두 개의 문자열은 모두 같고, 15와 16이라는 숫자에만 값의 변화가 일어났습니다.
이렇게 문자열 내에서 특정 값만 바꿔야 하는 경우가 있는데, 이것이 가능하도록 해 주는 것이
'문자열 포맷팅'입니다. 즉, 문자열 안에 어떤 값을 삽입하는 방법입니다.
문자열 포맷팅은 '문자열 포맷 코드를 활용하는 방법', 'format 함수를 활용하는 방법', 그리고 Python 3.6 이상만 지원이 되는 'f 문자열 포맷팅을 활용하는 방법'으로 총 3가지가 있습니다.
#3-2. 문자열 포맷 코드를 이용한 포맷팅
문자열 포맷 코드에는 %d, %s 등 외에도 여러 가지가 있지만 이번 포스팅에서는 앞의 2가지만 다루도록 하겠습니다.
① %d
>>> print("I have %d pens" %)
위의 양식을 보면, 숫자가 들어가야 하는 곳에 "%d" 가 들어가 있습니다.
%d 는 정수를 나타내는 포맷 코드입니다. 문자열 맨 뒤에 있는 ' % ' 뒤에 숫자를 입력하게
되면, 그 숫자에 맞게 문자열이 출력됩니다. 예를 들어, 105를 대입한다고 합시다.

대입한 숫자가 문제 없이 출력되었다는 것을 볼 수 있습니다.
다른 방식으로 숫자를 대입할 수도 있습니다.
>>> number = 105
>>> print("I have %d pens" %number)
이런 식으로 변수를 미리 준 후, print 함수에 마지막 ' % ' 뒤에 숫자를 입력하는 것 대신에
변수 'number'를 입력해주게 되면, 우리가 ' number = ' 뒤에 어떤 숫자를 대입하느냐에 따라
다른 출력물이 생기게 됩니다.

이렇게 될 것입니다.
여기서 주의할 점은, 정수, 실수 등의 숫자형은, 변수에 대입할 때 큰 따옴표나 작은 따옴표를 사용하지 않습니다.
② %s
>>>print("I have %s pens" %)
이번에는 %d 가 아니라 %s 를 사용하였습니다. %d는 숫자를 넣기 위한 포맷 코드였다면,
%s 는 문자열을 넣기 위한 포맷 코드입니다.

이렇게 %뒤에 문자열을 입력해주면, 정상적으로 출력되는 것을 확인할 수 있습니다.
%뒤에 써줄 때도, 숫자가 아닌 문자로 이루어진 문자열을 써 줄 때에는 작은 따옴표나
큰 따옴표를 써 주어야 합니다.

마찬가지로 number 변수를 미리 선언하고 입력할 수 있습니다.
여기에서 한 가지의 팁을 드리자면, %s의 경우, %d를 포함할 수 있습니다.
%d를 사용해야 하는 자리에 %s를 사용해도 되지만, %s를 사용해야 하는 자리에는 %s만
사용해야 합니다. 다만 주의해야 하는 점은, 숫자가 아닌 문자열로 이루어진 것을 삽입할
때에는 반드시 따옴표를 사용하는 습관을 들여야 한다는 것입니다.
③ 여러가지 값 대입
그렇다면 문자열 안에 여러 가지 값을 넣고 싶다면 어떻게 해야 할까요?
>>> number = 100
>>> day = "six"
>>> print("I have %d pens. I have bought them for %s days." % (number,day)
위와 같이 마지막 % 다음에 괄호와 ' , '로 구분하여 값을 넣어주면 됩니다. (튜플)

잘 출력된 것을 볼 수 있습니다. 당연히 값은 위에 선언한 변수에서 바꾸어 주면 되며,
%d는 %s로 바꾸어도 에러없이 출력됩니다.
④ 문자열 안에서 ' % '를 사용해야 하는 경우
The rate is 3.5%.
라는 문자열을 출력하고 싶다면 어떻게 작성해야 할까요?
>>> print("The rate is %d%%." %3.5)
이렇게 출력하면 됩니다.
자세히 보면, '%d%%' 의 형태로 사용한 것을 볼 수 있습니다. 문자열 포맷 코드 %d와 %가 같은 문자열 안에 존재하는 경우, %를 나타내려면 반드시 ' %% '로 써야 하는 법칙이 있기
때문입니다. 물론 %s로 사용할 경우에도 마찬가지입니다.
하지만 문자열 안에 %d 같은 포맷 코드가 없으면 %는 홀로 쓰여도 상관이 없습니다.
⑤ 숫자와 함께 사용할 경우
포맷 코드는 숫자와 함께 사용할 경우 더 유용하게 사용할 수 있습니다. 예를 들어,
>>> print("Hello %9s" %"everyone")
이렇게 사용한다고 했을 때, %s 사이에 있는 숫자 ' 9 ' 는 "문자열 중 길이가 9만큼인 공간에
대입된 문자를 오른쪽으로 정렬하고, 나머지 빈 공간은 공백으로 채워라" 라는 의미입니다.
어렵게 느껴지시겠지만, 직접 입력해 본다면,

'everyone' 부터 앞에 1만큼의 공백이 생긴 것을 볼 수 있습니다.
즉, everyone 의 문자열 길이는 ' 8 '이므로,' 9 '만큼의 공간에 대입된 'everyone' 이라는 문자를 오른쪽으로 정렬하고, 나머지 ' 1 ' 만큼은 공백으로 채우라는 의미입니다.
그렇기 때문에 숫자를 쓰지 않고 출력한 문자열과 비교했을 때, 중간에 공백이 한 칸 더 생기게
된 것입니다.
포맷 코드 사이에 음수를 넣은 경우, 왼쪽 정렬이 되게 됩니다.
#3-3. format 함수를 이용한 포맷팅
format 함수는 포맷 코드에서 조금 더 발전한 스타일의 문자열 포맷 방식입니다.
우선, 숫자와 문자를 그냥 넣을 수 있습니다.
>>> print("I have {0} pens".format(100))
>>> print("I have {0} pens".format("one hundred"))
위와 같은 형태로, ' {0} ' 을 입력해준 후, 맨 뒤에 ' .format() '을 넣어주시면 됩니다.
숫자를 대입한다면 따옴표 없이, 문자열을 대입한다면 따옴표를 포함해서 넣어주시면 됩니다.

잘 출력되는 것을 볼 수 있습니다.
포맷 코드를 사용해서 적용했던 케이스를 다시 보겠습니다.
① 숫자 할당 후 함수 이용
>>> number = 100
>>> print("I have {0} pens.".format(number))
숫자를 미리 변수에 할당한 후, format 함수를 이용하여 코드를 나타내 보겠습니다.

문제 없이 잘 출력된다는 것을 볼 수 있습니다.
② 여러가지 값을 대입하는 경우
여러 가지 값을 대입하는 경우를 생각해 봅시다.
여러 가지 값을 대입하는 경우에는 {0} , {1} 등의 인덱스 항목들이 입력값으로 바뀌게 됩니다.
>>> number = 100
>>> day = "six"
>>> print("I have {0} pens.
... I have bought them for {1} days.".format(number,day))

문제 없이 잘 출력된 것을 확인할 수 있습니다.
여러가지 값을 대입하는 경우, 그 이름으로도 대입할 수 있습니다.
>>> print("I have {number} pens.
... I have bought them for {day} days.".format(number=10,day="six"))

잘 출력 되는 것을 볼 수 있습니다.
③ index와 이름을 혼용
인덱스와 이름을 혼용해서 사용할 수도 있습니다.
>>> print("I have {0} pens.
... I have bought them for {day} days.".format(100, day="six"))

정상적으로 잘 출력되는 것을 볼 수 있습니다.
④ 정렬시키기
또한, format 함수로도 정렬을 시킬 수 있습니다.
' :< ' , ' :< ' , ' :^ ' 의 3가지로 각각 왼쪽, 오른쪽, 가운데 정렬을 시킬 수 있습니다. 예를 들어,
>>> print("'{0:<10}'".format("World"))
>>> print("'{0:>10}'".format("World"))
>>> print("'{0:^10}'".format("World"))
위에서 부터 모두 각각 문자열의 총길이를 10으로 맞춰 출력하게 되는데,
문자열의 길이를 제외한 나머지는 공백으로 채우게 됩니다. 위 코드를 print하게 되면,

왼쪽, 오른쪽, 가운데 정렬이 된 것을 볼 수 있습니다.
위의 방법에서 공백을 문자값으로 채워 넣는 것도 가능합니다.
예를 들어, 왼쪽 정렬 후 공백 대신 ' - ' 문자를 넣고 싶다면, ' :< ' 이라는 표현식에서 ' : ' 와 ' < ' 사이에 넣어주시면 됩니다.
>>> print("'{0:-<10}'".format("World")

공백이 ' - '로 채워진 것을 확인하실 수 있습니다.
⑤ 소수점 표현하기
소수점을 나타낼 수 있는데, 원하는 자리 수까지만 나타내는 것이 가능합니다.
>>> x = 3.1415926535
>>> print("{0:0.2f}".format(x))
이렇게 나타내게 되면, 부동소수(floating)를 나타내는 ' f ' 앞에 숫자인 ' 2 ' 만큼의 자리 수를
출력하게 됩니다. 즉, ' 3.14 ' 를 출력하게 되겠죠?

출력된 것을 볼 수 있습니다.
물론, 앞에서 보았듯이 자리수를 지정하고, 공백으로 채울 수 있습니다.
>>> x = 3.1415926535
>>> print("'{0:^10.2f}'".format(x))
이렇게 나타낸다면, 소수점 2번째 자리까지 나타내고, 총 10자리의 문자열을 출력할 것입니다.
3.14 를 제외한 남은 여섯 자리는 공백으로 채워질 것입니다.

이렇게 응용해 볼 수 있습니다.
#3-4. f문자열 포맷팅을 이용한 포맷팅
f문자열 포맷팅은 최근에 생긴 방식이기 때문에, Python 3.6 version 이상부터 지원이 됩니다.
f문자열 포맷팅은 간단합니다. 문자열 앞에 접두사 " f ' " 를 붙여주면 됩니다.
>>> name = 'Lucas'
>>> birth = 2000
>>> print(f'내 이름은 {name}이라고 합니다. {birth}년생이에요.')
이렇게 코드를 작성하고 print를 해주면,

{name} 에는 이름이, {birth} 에는 생년이 잘 출력된 것을 확인할 수 있습니다.
① 표현식
또한, f문자열 포맷팅은 표현식을 지원하기 때문에 다음과 같이 사용할 수도 있습니다.
* 표현식
표현식은, 문자열 안에서 변수와 ' + ' , ' - '와 같은 수식을 함께 사용하는 식입니다.
>>> birth = 2000
>>> print(f'나는 {birth}년생입니다. 내 동생은 {birth+4}년생입니다.')
이렇게 출력하게 되면, ' birth + 4 '라는 값에도 정상적으로 대입할 수 있습니다.

잘 응용하시면 될 것 같습니다.
② 딕셔너리(dictionary) 활용
또한, f문자열 포맷팅에서는 딕셔너리를 함께 활용하면 편리합니다.
* 딕셔너리(dictionary)
딕셔너리(dictionary)란, Key와 Value를 한 쌍으로 갖는 자료형입니다.
이후에 자세하게 다루게 될 것입니다.
>>> d = {'name':'Lucas','birth':'2000')
# name은 Lucas이고, birth는 2000이라는 값을 갖는 딕셔너리입니다.
>>> print(f'내 이름은 {d["name"]}입니다. {d["birth"]}년생이에요.')
이렇게 딕셔너리에서 name과 birth 값을 가져올 수 있도록 코드를 짜면,

잘 출력되는 것을 확인할 수 있습니다.
왼쪽, 오른쪽, 가운데 정렬 및 공백 표현, 공백 채우기, 소수점을 표현하는 방법은
format함수를 이용한 포맷팅과 기본적으로 사용하는 표현식이 동일합니다.
다만, 문자열 앞에 접두사를 붙여주고, ' .format ' 형식을 없애주는 것이 다릅니다.
또한, '0' 대신 문자열이 바로 들어가게 됩니다. 한 가지만 예를 들자면,
>>> x = 3.1415926535
변수 x를 소수점 2번째 자리까지만 표현하고, 길이를 10으로 만들고 가운데 정렬을 한 후,
공백 대신 ! 로 채우고 싶다고 가정합니다.
format함수를 이용한 포맷팅에서는
>>> print("{0:!^10.2f}".format(x))
로 표현하였습니다.
그러나 f문자열 포맷팅에서는
>>> print(f'{x:!^10.2f}')
이렇게 표현합니다. '0' 대신에 'x'라는 문자열이 바로 들어왔습니다.

출력되는 값은 동일하다는 것을 알 수 있습니다.
여기까지 문자열과 문자열 포맷팅에 대해서 알아 보았습니다.
댓글