님들, 안녕하세요. 14년차 IT 개발자 데니예요. 오늘은 파이썬 문자열 포매팅(formatting)에 대해서 배울 거예요. 문자열 중에 일부가 변할 수 있는 가능성이 있는 경우에 문자열 포매팅을 사용해요. 아마 이해가 잘 안 되실 거예요. 자세한 설명은 아래에서 해드릴게요. 우선 파이썬에는 총 3가지의 문자열 포매팅(formatting) 방식이 있다는 것만 알아두시면 좋을 거 같아요. 3가지 방식 중에 2가지(%포매팅 사용, format함수 사용)는 이번 포스팅에서 설명해 드릴 거고요. 나머지 1개인 f-string 방식은 다음 포스팅에서 설명해 드릴게요. 그럼 문자열 포매팅 2가지 방식에 대한 강의 시작해 볼게요.
1. 파이썬 문자열 포맷팅(formatting)
만약 님이 현재 학생이고, 아래와 같은 성적을 받았다고 가정해 보아요. 아주 훌륭한 성적을 하루빨리 부모님께 보여드리고 칭찬과 용돈 받아야 하잖아요. 부모님은 학교 성적관리 앱을 통해 님의 성적을 조회해 보실 수 있다고도 가정해 보아요. 성적관리 앱은 친절하게 부모님 스마트폰으로 님의 과목별 성적을 출력해 줄 거예요.
파이썬 IDLE 쉘창이 학교 성적관리 앱이라고 생각해 보시고, 아래와 같이 문자열을 작성해서 엔터를 쳐보세요. 홍길동 학생의 과학, 수학 점수가 출력되었어요. 홍길동 학생과 같은 반 학생 인원이 총 25명이라고 한다면, 25명의 학생에 대한 성적 출력 문자열을 모두 작성해서 출력시켜줘야 할까요? 그럼 총 25개의 문자열이 만들어지겠죠. 학생 수가 100명, 200명, 300명 .... 10,000명 이상이라면, 프로그래머는 성적 출력 문자열을 만드는데 많은 시간을 소비해 버리겠죠. 성적관리 앱을 개발하기 위한 시간도 충분하지 않을 텐데, 10,000개 이상의 문자열을 만드는 건 쉽지 않을 거예요.
시간과 자원을 낭비하지 않고, 효율적으로 사용하기 위해서 문자열 포매팅을 사용하는 거예요.
문자열 포매팅이란 문자열 속 특정한 위치에 특정한 값을 삽입해 주는 것을 의미해요. 위 예에서 '홍길동 수학 100점, 과학 95점'이란 문자열을 사용해서 홍길동 학생의 성적을 출력해 주었다면, 다른 학생의 성적을 출력해 주기 위해선 해당 문자열에 이름(홍길동 → 나둘리)과 점수(100 → 50, 95 → 70)만 바꿔서 다시 사용하면 돼요. '나둘리 수학 50점, 과학 70점'이란 문자열이 출력될 거예요. 파이썬 문자열 포매팅 방식에는 총 3가지 방식이 존재해요. 첫 번째는 % 포매팅 방식, 두 번째는 format 함수 방식, 세 번째는 f-string 방식이에요. %포매팅 방식부터 설명과 실습 시작해 볼게요.
▶ % 포매팅 사용
아래 표는 학생들의 수학과 과학 성적 점수를 나타내고 있어요. 저와 님들은 단 1개의 문자열을 사용해서 학생들의 성적을 출력해 줄 거예요.
아래 파이썬 IDLE 쉘 창에 입력시킨 문자열을 봐주세요. 자세히 보시면 문자열에 학생 이름과 과목 점수가 들어가야 할 부분에 %s와 %d가 입력되어 있는 걸 확인하실 수 있어요. 뿐만 아니라 문자열을 둘러싼 작은 따옴표(' ') 끝에 %가 붙어 있고 그다음에 ('홍길동', 100, 95)가 입력되어 있어요. 결과적으로 홍길동 학생의 성적 결과가 출력되었어요.
님들이 궁금해하시는 부분을 하나하나 설명해 드릴게요. 문자열 내에 존재하는 %s는 이곳에 문자열을 삽입하겠다는 의미예요. %d는 이곳에 정수(integer)를 삽입하겠다는 의미예요. 문자열이 끝나는 부분에 %는 바로 뒤에 나오는 값들('홍길동', 100, 95)을 문자열 내에 존재하는 %s와 %d에 연결(삽입)시켜주겠다는 의미예요.
아래 그림에 파란색 네모와 선을 보시면 괄호() 안에 첫 번째 인자인 '홍길동'을 문자열 내 첫 번째로 나오는 %s에 연결(삽입)시키라는 명령이에요. 빨간색 네모와 선은 괄호() 안에 두 번째 인자인 숫자 100을 문자열 내 두 번째로 나오는 %d에 연결(삽입)시키라는 명령이에요. 노란색 네모와 선은 괄호() 안에 세 번째 인자인 95를 문자열 내 세 번째로 나오는 %d에 연결(삽입)시키라는 명령이에요.
문자열 내에 존재하는 %s와 %d는 문자열 포맷 코드라고 해요. 해당 실습에서는 문자열과 정수(integer)만 사용했지만, 부동소수(Floating-poin), 8진수, 16진수 등을 사용할 수 있어요.
%포매팅에 대한 개념과 사용법을 파악했으니, 3명의 학생 성적을 1개의 문자열을 이용해서 출력해 주는 실습을 진행해 보겠어요. 아래 실습 예제를 눈으로 먼저 쓰윽 보시고 이해하신 다음에 님들의 실습창에 코딩하고 실행해 보시면 더 기억에 오래 남으실 거예요.
1
2
3
4
5
6
7
|
>>> str = '%s 수학 %d점, 과학 %d점'
>>> str%('홍길동', 100, 95)
'홍길동 수학 100점, 과학 95점'
>>> str%('나둘리', 50, 70)
'나둘리 수학 50점, 과학 75점'
>>> str%('피카쵸', 90, 80)
'피카쵸 수학 90점, 과학 85점'
|
cs |
라인[1] str변수에 문자열 포맷 코드(%s, %d)가 들어간 문자열을 대입했어요.
라인[2] str변수에 %포매팅 방식을 사용해서 홍길동 학생의 성적을 출력했어요.
라인[4] 나둘리 학생의 성적을 출력했어요.
라인[6] 피카쵸 학생의 성적을 출력했어요.
결과적으로 str 문자열 변수 1개를 사용해서 홍길동, 나둘리, 피카쵸 학생의 성적을 출력해 보았어요.
앞선 설명에서 문자열 포맷 코드(string format code)에 대해서 언급드렸어요. 우리는 %s와 %d만 사용해 봤는데, 이외에 포맷 코드가 존재해요. 이 포맷 코드들 중에 %s, %d, %f가 가장 많이 쓰이고요. %%는 문자로 %를 출력하고 싶을 때 사용하시는 거예요.
예를 들면, 매년 경제 성장률을 출력해 주는 문자열을 만들고 싶다면 '내년 경제 성장률 %f%% 예상'이라는 문자열을 만들고 그 뒤에 % 포매팅 방식을 사용하여 숫자를 입력해 주면 돼요. '내년 경제 성장률 %f%% 예상'%(2.7) 이라고 코딩하시고 실행하시면, '내년 경제성장률 2.7% 예상'으로 출력될 거예요. 경제 성장률이 정수(Integer)가 아닌 부동소수(Floating-point)로 나올 수도 있기 때문에 %f를 사용하였어요.
위에서 문자열 포맷 코드를 말씀드리면서 함께 설명한 실습 예제예요. 내년 예상 경제 성장률을 출력해 주는 문자열을 % 포매팅 방식을 사용하여 출력해주고 있어요.
1
2
3
|
>>> nx_yr_eg_rate = '내년 경제 성장률 %f%% 예상'
>>> nx_yr_eg_rate%(2.75454564654)
'내년 경제 성장률 2.75454564654% 예상'
|
cs |
위 실습예제에서 소수점 이하 자릿수가 너무 길어서 거슬리시는 분들이 계셨을 거예요. %.2f 를 사용하시면 소수점 이하 2자리까지 출력해 줄 거예요.
1
2
3
|
>>> next_year_economic_rate_point2 = '내년 경제 성장률 %.2f%% 예상'
>>> next_year_economic_rate_point2 %(2.75454564654)
'내년 경제 성장률 2.75% 예상'
|
cs |
▶ format 함수 사용
님들, 위에서 배운 % 포매팅 방식을 사용하실 때에 반드시 적절한 문자열 포맷 코드(%d, %s, %f 등)를 입력해줘야 한다는 불편함이 있어요. 예를 들면 '내 나이는 %d'%('10살')이라는 %포매팅 방식을 사용한 문자열을 출력하려 했을 때에 TypeError가 발생할 거예요. 그 이유는 문자열 포맷 코드 %d는 정수(integer)만 인자로 전달받을 수 있는데, '10살'이라는 문자열로 넘겨줬기 때문이에요.
파이썬은 문자열 포맷 코드를 신경 쓰지 않고 문자열 서식을 편리하게 사용할 수 있도록 문자열 함수인 format 함수를 제공하고 있어요. format 함수의 핵심 기능은 바로 숫자를 문자열로 변경해서 인자로 전달해 주는 것이예요. 즉, 문자열은 문자열 그대로 전달하고, 숫자인 경우 파이썬이 자동으로 문자열로 변경한 후 인자로 전달해주는 기능이에요. 결과적으로 우리는 전달하려는 인자 값에 따라 %d, %s, %f 등 문자열 포맷 코드를 선택하려는 시간 소비를 줄일 수 있고, 선택 실수로 인해 TypeError가 발생할 일이 전혀 없게 되는 거예요.
아래 그림은 %포매팅 방식에서 사용한 동일 예제예요. 3명의 학생들의 수학과 과학 성적이에요. 우리는 format 함수를 사용해서 학생들의 성적을 출력해 볼 거예요.
아래 소스코드 라인[1]을 보시고, 어떻게 출력될지 생각해 보신 다음에 출력 결과인 라인[2]을 확인해 주시면 더 좋은 학습이 되실 거예요. 문자열 format 함수 방식에서는 문자열 내에 특정 값을 삽입하고 싶은 부분에 중괄호{ }를 넣고 중괄호 안에 인덱스(index)를 입력했놨어요. 인덱스 순번은 0번부터 시작해요.
위 실습 예제에서 우리는 3개의 인자(이름, 수학 점수, 과학 점수)를 문자열 내에 전달(삽입) 해야 하므로 3개의 중괄호를 원하는 부분에 위치시키고, 각각의 중괄호 안에 0부터 2까지 인덱스를 입력했었요. 그리고 format 함수에 접근하기 위해서 문자열이 끝난 마지막 부분에 .format('홍길동', 100, 95)를 입력시켰어요. 앞서 말씀드렸던 거처럼 '홍길동' 문자열은 문자열 그대로 {0}에 인자값으로 전달되고요. 숫자인 수학점수 100과 과학점수 95는 각각 '100'과 '95'인 문자열로 변환되어 {1}과 {2}에 인자값으로 전달돼요. 라인[2]을 보시면 '홍길동 수학100점, 과학 95점'으로 우리가 원했던 문자열이 정상적으로 출력된 걸 확인하실 수 있어요.
다음은 학생 이름과 과목별 성적을 변수에 대입한 후, 그 변수를 format함수에 입력하여 문자열을 출력해 보는 실습을 해볼 거예요.
1
2
3
4
5
6
|
>>> name = '홍길동'
>>> math_grade = 100
>>> science_grade = 95
>>> str = '{0} 수학 {1}점, 과학 {2}점'
>>> str.format(name, math_grade, science_grade)
'홍길동 수학 100점, 과학 95점'
|
cs |
라인[1]은 학생이름을 name 변수에 대입했어요.
라인[2]와 라인[3]은 과목별 성적을 math_grade와 science_grade에 대입했어요.
라인[4]는 문자열 format 함수 방식을 사용하기 위해서 문자열 서식을 만들어 str 변수에 대입했어요.
라인[5]는 name, math_grade, science_grade 변수를 format함수 인자로 입력했어요.
라인[6]은 홍길동 학생의 이름과 성적이 문자열로 출력되었어요.
format 함수를 사용할 때 만드는 문자열 서식에 {0}, {1}...{N} 등의 인덱스를 사용해도 되지만, {name}, {grade1}, {grade2}와 같이 이름을 사용할 수 있어요.
1
2
3
4
5
6
7
8
|
>>> name = '홍길동'
>>> math_grade = 100
>>> science_grade = 95
>>> str = '{name} 수학 {grade1}점, 과학 {grade2}점'
>>> str
'{name} 수학 {grade1}점, 과학 {grade2}점'
>>> str.format(name = name, grade1 = math_grade, grade2 = science_grade)
'홍길동 수학 100점, 과학 95점'
|
cs |
라인[1]~[3]은 바로 위 실습 예제와 동일해요.
라인[4]는 바로 위 실습 예제에서 문자열 서식 내에 {0}, {1}, {2} 인덱스를 사용했으나, 현재는 {name}, {grade1}, {grade2} 이름을 사용했어요.
라인[5]와 라인[6]은 문자열 변수 str를 입력하고 출력해 보았어요.
라인[6]을 보시면 앞으로 문자열 내에 어느 부분에 어떤 값을 입력시켜야 할지 인덱스를 사용하는 것보다 훨씬 명확하게 알 수 있게 되었어요.
라인[7]은 여기서 가장 중요하게 보셔야 하는 부분이 name = name 이 부분이에요. 라인[1]에서 '홍길동'을 대입한 name 변수와 라인[6]에서 {name} 이름 변수는 동일한 변수가 아니라는 점이에요. 그렇기 때문에 .format(name = name, grade1 = math_grade, grade2 = science_grade)로 각 각 이름 변수에 인자값으로 전달하고자 하는 학생이름 변수(name), 수학점수 변수(math_grade), 과학점수 변수(science_grade)를 대입시켜줘야 한다는 점이에요. 이 점 절대 잊지 마셔야 해요.
라인[8]은 홍길동 학생의 이름과 성적이 문자열로 출력되었어요.
이제 3명 학생들의 성적을 format() 함수 방식을 사용해서 출력해 줘야겠죠.
1
2
3
4
5
6
7
|
>>> str = '{name} 수학 {grade1}점, 과학 {grade2}점'
>>> str.format(name = '홍길동', grade1 = 100, grade2 = 95)
'홍길동 수학 100점, 과학 95점'
>>> str.format(name = '나둘리', grade1 = 50, grade2 = 70)
'나둘리 수학 50점, 과학 70점'
>>> str.format(name = '피카쵸', grade1 = 90, grade2 = 80)
'피카쵸 수학 90점, 과학 80점'
|
cs |
라인[1]은 format 함수 방식을 사용하기 위해서 문자열 서식을 만들고 str 변수에 대입했어요.
라인[2]~라인[7]은 각 학생의 이름과 성적을 출력해주고 있어요.
다음은 %포매팅 방식에서 사용하였던 실습 예제인 내년 경제 성장률을 format함수 방식으로 출력해 볼 거예요.
1
2
3
|
>>> nx_yr_eg_rate = '내년 경제 성장률 {0}% 예상'
>>> nx_yr_eg_rate.format(2.75454564654)
'내년 경제 성장률 2.75454564654% 예상'
|
cs |
라인[1]은 문자열 서식을 작성해서 nx_yr_eg_rate 변수에 대입했어요. {0} 인덱스를 사용했네요.
라인[2]와 라인[3]은 경제 상장률을 format함수 인자로 전달하여 문자열을 출력하였어요.
바로 위 예제에서 소수점 이하 자릿수가 길기 때문에 우리는 소수점 이하 2자리만 출력되게끔 format 함수 방식을 사용하여 실습해 볼 거예요.
1
2
3
|
>>> nx_yr_eg_rate = '내년 경제 성장률 {0:.2f}% 예상'
>>> nx_yr_eg_rate.format(2.75454564654)
'내년 경제 성장률 2.75% 예상'
|
cs |
라인[1]은 문자열 서식을 작성하여 nx_yr_eg_rate 변수에 대입하였어요. 소수점 이하 2자리까지 출력하기 위해서 {0:.2f} 서식을 사용하였어요. 중괄호 안에 0은 인덱스를 의미해요. :.2f 가 바로 소수점 이하 2자리까지 출력하라는 표현이에요.
라인[2]와 라인[3]은 경제 상장률을 format함수 인자로 전달하여 문자열을 출력하였어요.
.2f 라는 표현이 조금 어렵거나 제가 앞서 설명드린 것처럼 format함수 방식에서는 문자열 포맷 코드를 사용 안 한다고 했는데, f가 들어가서 설명에 일관성이 떨어져 받아들이기 어렵다고 생각하시는 분들을 위해서 아래와 같은 실습 예제를 준비했어요. f를 빼시고 {0:.3}으로 표현해 주시면 돼요. 소수점 이하 2자리까지 출력하기 위해선 .3으로 입력해주셔야 해요. 3자리까지 출력하고 싶으시다면. 4를 입력해 주시면 돼요.
1
2
3
|
>>> nx_yr_eg_rate = '내년 경제 성장률 {0:.3}% 예상'
>>> nx_yr_eg_rate.format(2.75454564654)
'내년 경제 성장률 2.75% 예상'
|
cs |
이번 포스팅의 마지막 실습으로 문자열 정렬(왼쪽, 가운데, 오른쪽)을 해보려 해요. 문자열 정렬 기능을 통해서 출력하시려는 문자열을 예쁘게 배치시키실 수 있어요.
문자열 'Hello'를 왼쪽에 위치시키고, 6자리만큼 공간을 띄웠어요. 결과적으로 왼쪽 정렬을 되었어요.
1
2
3
|
>>> str = '{0:<10}'
>>> str.format('Hello')
'Hello '
|
cs |
라인[1]은 '{0:<10}' 문자열 서식을 만들어서 str변수에 대입했어요. 중괄호{ } 안을 보시면 인덱스 0 옆에 :<10을 입력했어요. < 문자는 인덱스 0으로 전달되는 문자열을 왼쪽으로 정렬시키라는 표현이에요. 10은 출력될 문자열 전체 길이를 지정해 준 거예요. 전체 출력 문자열 길이는 10자리이고, 10자리 중에서 'Hello'는 5자리이므로 나머지 5자리는 띄어쓰기로 출력될 거예요.
라인[3]은 5자리인 문자열 Hello가 왼쪽 정렬되고 나머지 5자리는 띄어쓰기로 총 10자리 문자열이 출력되었어요.
다음은 오른쪽 정렬을 해보시는 실습 예제예요.
1
2
3
|
>>> str = '{0:>10}'
>>> str.format('Hello')
' Hello'
|
cs |
라인[1]은 '{0:>10}' 문자열 서식을 만들어서 str변수에 대입했어요. > 문자는 인덱스 0으로 전달되는 문자열을 오른쪽으로 정렬시키라는 표현이고, 10은 문자열 전체 길이를 지정한 거예요.
라인[3]은 처음 5자리가 띄어쓰기되고, 나머지 5자리는 Hello 문자열이 오른쪽 정렬되어 출력되었어요.
다음은 가운데 정렬을 해보시는 실습이에요.
1
2
3
|
>>> str = '{0:^10}'
>>> str.format('Hello')
' Hello '
|
cs |
라인[1]은 '{0:^10}' 문자열 서식을 만들어서 str변수에 대입했어요. ^문자는 인덱스 0으로 전달되는 문자열을 가운데로 정렬시키라는 표현이고, 10은 문자열 전체 길이를 지정한 거예요.
라인[3]은 처음 2자리가 띄어쓰기되고, 문자열 Hello 5자리가 가운데 정렬되고 마지막으로 나머지 3자리가 띄어쓰기되었어요. 이처럼 가운데 정렬 시에 띄어쓰기 자릿수가 홀수인 경우 좌측 n자리, 우측 n+1자리로 가운데 정렬이 돼요.
문자열을 가운데 정렬하고 띄어쓰기되는 부분에 다른 문자를 채우고 싶은 경우 아래 실습 예제를 참고하시면 돼요.
1
2
3
|
>>> str = '{0:=^10}'
>>> str.format('Hello')
'==Hello==='
|
cs |
라인[1]은 '{0:=^10}' 문자열 서식을 만들어서 str변수에 대입했어요. 위 실습 예제와 다른 부분은 = 문자예요. 띄어쓰기 부분에 다른 문자를 채워 넣고 싶으시면 :^ 사이에 원하시는 문자를 입력하시면 돼요. 저는 = 문자를 입력해 봤어요.
라인[3]은 띄어쓰기 부분이 사라지고 = 문자로 채워진 걸 보실 수 있으세요.
님들 오늘도 여기까지 읽어 주시고 실습 병행해 주셔서 정말 고생하셨어요. 제가 님들의 실력이 향상되는 모습을 직접 눈으로 볼 수 없어서 매우 아쉽지만, 잘하고 계실 거라고 항상 생각하고 있어요. 그리고 마음으로 님들의 파이썬 실력이 향상되길 항상 바라고 기도드리고 있으니 앞으로도 제 블로그 방문해 주셔서 파이썬 입문에 꼭 성공하시길 바랄게요. 감사합니다.
다음 시간에는 문자열 서식 출력에서 가장 사용하기 용이한 f-string 방식에 대해서 설명해 드릴게요. 다음 시간에 봬요.
'파이썬 독학 > 입문 강의' 카테고리의 다른 글
[파이썬독학강의] 5.6 파이썬 문자열 함수(function)_문자열 관련 함수 (0) | 2023.02.05 |
---|---|
[파이썬독학강의] 5.5 파이썬 문자열 f-string 사용법 (0) | 2023.02.02 |
[파이썬독학강의] 5.3 파이썬 문자열 인덱싱(indexing)과 슬라이싱(slicing) (0) | 2023.01.28 |
[파이썬독학강의] 5.2 파이썬 자료형(문자열 기본) (0) | 2023.01.21 |
[파이썬독학강의] 5.1 파이썬 자료형(숫자) (0) | 2023.01.18 |