Programming/Python

[코딩도장-파이썬] 문자열 응용하기 2 (formatting, 포매팅)

Supreme_YS 2020. 11. 24. 20:22

*python script 환경에서 작업하고 있습니다.


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

  • '%s' % '문자열'

파이썬은 다양한 방법으로 문자열을 만들 수 있습니다. 그중에서 서식 지정자(format specifier)로 문자열을 만드는 방법과 format 메서드로 문자열을 만드는 문자열 포매팅(string formatting)에 대해 알아보겠습니다. 문자열 안에서 특정 부분을 원하는 값으로 바꿀 때 서식 지정자 또는 문자열 포매팅을 사용합니다.

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

2. 서식 지정자로 숫자 넣기

  • '%d' % 숫자

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

formatting3 = 'I am %d years old.' % 20

print(formatting3)
I am 20 years old.

숫자 중에 소수점으로 된 실수를 넣어야 할 경우도 있습니다. 실수를 넣을 때는 %f를 사용하며 고정 소수점 fixed point의 f입니다. %f는 기본적으로 소수점 이하 6자리까지 표시하므로 2.3은 2.300000으로 표시됩니다.

  • '%f' % 숫자
formatting4 = 'I am %.2fyears old.' % 29.9

print(formatting4)
I am 29.90years old.

3. 서식 지정자로 문자열 정렬하기

  • %길이s

이번에는 서식 지정자와 숫자를 조합하여 문자열을 정렬하는 방법을 알아보겠습니다. 다음과 같이 % 뒤에 숫자를 붙이면 문자열을 지정된 길이로 만든 뒤 오른쪽으로 정렬하고 남는 공간을 공백으로 채웁니다. %20s는 문자열의 길이를 20으로 만든 뒤 지정된 문자열을 넣고 오른쪽으로 정렬합니다. 따라서 문자열 'data scientist'은 길이가 14이므로 왼쪽 공간을 공백 6칸으로 채웁니다.

formatting5 = 'my job is %20s' % 'data scientist'

print(formatting5)
my job is       data scientist

왼쪽 정렬은 문자열 길이에 -를 붙여주면 됩니다.

formatting6 = '%-10s' % 'python' python

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

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

  • '%d %s' % (숫자, '문자열')
month_date = 'Today is %d %s.' % (24, 'November')

print(month_date)
Today is 24 November.

여기서는 서식 지정자가 두 개이므로 값도 두 개 넣었습니다. 이처럼 서식 지정자가 여러 개면 괄호 안의 값(변수) 개수도 서식 지정자 개수와 똑같이 맞춰주어야 합니다. 지금까지 서식 지정자 사이를 공백으로 띄웠습니다. 만약 서식 지정자를 서로 붙이면 결과도 붙어서 나오므로 주의해야 합니다. 다음은 24와 'November'가 붙어서 24November 나옵니다.

month_date = 'Today is %d%s.' % (24, 'November')

print(month_date)
Today is 24November.

5. format 메서드 사용하기

  • '{인덱스}'.format(값)

파이썬은 문자열을 만들 때 서식 지정자 방식보다 더 간단한 문자열 포매팅(string formatting)을 제공합니다. 문자열 포매팅은 { }(중괄호) 안에 포매팅을 지정하고 format 메서드로 값을 넣습니다. 이렇게 문자열 안에 { }를 넣고 인덱스를 지정합니다. 그리고 format에는 { } 부분에 넣을 값을 지정하면 됩니다.

formatting = 'Hello, {0}'.format('Python')

print(formatting)
Hello, Python

6. format 메서드로 값 여러 개 넣기

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

formatting_method = 'Hello, {0} {2} {1}'.format('Python', 'Script', 3.85)

print(formatting_method)
Hello, Python 3.85 Script

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

multi =  '{0} {0} {1} {1}'.format('Python', 'Script')
print(multi)
Python Python Script Script

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

multi2 = 'Hello, {} {} {}'.format('Python', 'Script', 3.8)
print(multi2)
Hello, Python Script 3.8

{ }에 인덱스 대신 이름을 지정할 수도 있습니다.

multi3 = 'Hello, {language} {version}'.format(language='Python', version=3.8)
print(multi3)
Hello, Python 3.8

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

multi4 = f'Hello, {language} {version}'
print(multi4)
Hello, Python 3.8

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

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

문자열 포매팅도 문자열을 정렬할 수 있습니다. 다음과 같이 인덱스 뒤에 :(콜론)을 붙이고 정렬할 방향과 길이를 지정해주면 됩니다. 참고로 인덱스를 사용하지 않는다면 :(콜론)과 정렬 방법만 지정해도 됩니다.

arrange = '{0:<10}'.format('Python')

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

 

arrange2 = '{0:>10}'.format('Python')

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

7. 숫자 개수 맞추기

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

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

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

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

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

실수는 정수, 소수점, 소수점 이하 자릿수가 모두 포함됨 출처. 코딩도장

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

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

문자열 포매팅은 채우기와 정렬을 조합해서 사용할 수 있습니다. 다음과 같이 { }에 인덱스, 채우기, 정렬, 길이, 자릿수, 자료형 순으로 지정해줍니다. 그럼 길이를 10으로 만든 뒤 왼쪽, 오른쪽으로 정렬하고 남는 공간은 0으로 채워보겠습니다.

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

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

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

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

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