개발자/파이썬 Python

파이선 서식 지정자와 출력 포맷팅. 리얼파이선 11

지구빵집 2022. 2. 15. 11:30
반응형

 

 

 

파이썬에서 무엇인가 출력할 때 print() 함수를 사용해 데이터를 모니터로 출력합니다. 출력하는 내용을 문자열로 만들어서 표현할 수 있습니다. 데이터를 문자열로 만들던, 아니면 데이터 자체가 갖는 자료형으로 사용하던지 결국 화면에 출력되는 결과물은 문자열로 인식합니다. 

 

파이선 서식 지정자와 출력 포맷팅. 리얼파이선 11 

 

생각해보면 당연한 것이 만약 공책에 연필로 숫자를 쓰거나 문자를 쓰거나 혹은 *, $, % 와 같은 특수 문자를 쓰던 어떤 것이든 문자로 표현되기 때문이죠. 우리의 인식이 숫자나 문자 그리고 특수문자일 뿐이지, 실제적으로 표현되는 것은 '문자열'입니다.

 

'문자열 포매팅'이란, 문자열을 형식화된 문자열로 표현하는 방법입니다. 문자열을 이용하여 어떠한 데이터를 표현할 때, 그 데이터를 표시하고 싶은 방식(자릿수, 소수점, 기호와 문자 변환 등)의 자료형의 형식(서식)에 맞게 그에 대응하는 데이터를 문자열로 표현할 수 있습니다.  

 

서식 지정자란, 특정 자료형을 표현하는 방법으로 자주 사용되는 서식 지정자는 다음과 같은 것들이 있습니다.

  • %d : 'Decimal Integer를 의미하는 것으로, 정수 자료형을 표현합니다.
  • %f : 'Floating point'를 'Fixed Point'로 표현하는 것을 의미하고, 실수 자료형을 표현합니다.
  • %s : 'String'을 의미하고, 문자열 자료형을 표현합니다. 

 

프로그램의 출력을 표현하는 여러 가지 방법이 있습니다. 지금까지 우리는 값을 쓰는 두 가지 방법을 만났습니다: 표현식 문장과 print() 함수입니다. (세 번째 방법은 파일 객체의 write() 메서드를 사용하는 것입니다. 표준 출력 파일은 sys.stdout 로 참조할 수 있습니다. 이것에 대한 자세한 정보는 라이브러리 레퍼런스를 보세요.)

 

장식적인 출력 포매팅 

 

종종 단순히 스페이스로 구분된 값을 인쇄하는 것보다 출력 형식을 더 많이 제어해야 하는 경우가 있습니다. 출력을 포맷하는 데는 여러 가지 방법이 있습니다. 아래 코드는 전체적인 출력 포맷팅을 사용하기 위한 개념을 보여줍니다. 

 

포맷 문자열 리터럴을 사용하려면, 시작 인용 부호 또는 삼중 인용 부호 앞에 f 또는 F 를 붙여 문자열을 시작하십시오. 이 문자열 안에서, { 및 } 문자 사이에, 변수 또는 리터럴 값을 참조할 수 있는 파이썬 표현식을 작성할 수 있습니다.

 

>>> year = 2016
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
'Results of the 2016 Referendum'

 

문자열의 str.format() 메서드는 더 많은 수작업을 요구합니다. 변수가 대체 될 위치를 표시하기 위해 { 및 }를 여전히 사용하고, 자세한 포매팅 디렉티브를 제공할 수 있지만, 포맷할 정보도 제공해야 합니다.

 

>>> yes_votes = 42_572_654
>>> no_votes = 43_132_495
>>> percentage = yes_votes / (yes_votes + no_votes)
>>> '{:-9} YES votes  {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes  49.67%'

 

마지막으로, 문자열 슬라이싱 및 이어붙이기 연산을 사용하여 상상할 수 있는 모든 배치를 만듦으로써, 모든 문자열 처리를 스스로 수행할 수 있습니다. 문자열형에는 주어진 열 너비로 문자열을 채우는 데 유용한 연산을 수행하는 몇 가지 메서드가 있습니다. 

 

 

파이썬은 다양한 방법으로 문자열을 만들 수 있습니다. 그중에서 서식 지정자(format specifier)로 문자열을 만드는 방법과 format 메서드로 문자열을 만드는 문자열 포매팅(string formatting)에 대해 알아보겠습니다.

 

예를 들어 학생의 이름과 평균 점수를 출력한다고 하죠. 

 

제임스의 평균 점수는 85.3점입니다.

 

제임스의 평균 점수는 85.3점입니다. 만약 학생이 바뀐다면 이름과 점수 부분도 바뀌겠죠?

 

마리아의 평균 점수는 98.7점입니다.

 

마리아의 평균 점수는 98.7점입니다. 두 문자열에서 '의 평균 점수는', '점입니다.'는 같지만 이름과 점수가 다릅니다. 이렇게 문자열 안에서 특정 부분을 원하는 값으로 바꿀 때 서식 지정자 또는 문자열 포매팅을 사용합니다.

 

서식 지정자로 문자열 넣기

 

그럼 서식 지정자(format specifier)로 문자열 중간에 다른 문자열을 넣어보겠습니다.

 

'%s' % '문자열'

 

>>> 'I am %s.' % 'james'
'I am james.'

 

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

 

물론 문자열을 바로 지정하지 않고 변수를 지정할 수도 있습니다.

 

>>> name = 'maria'
>>> 'I am %s.' % name
'I am maria.'

 

서식 지정자로 숫자 넣기

 

그럼 문자열 안에 숫자는 어떻게 넣을까요?

 

'%d' % 숫자

 

>>> 'I am %d years old.' % 20
'I am 20 years old.'

 

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

 

서식 지정자로 소수점 표현하기

 

숫자 중에 소수점으로 된 실수를 넣어야 할 경우도 있습니다.

 

'%f' % 숫자

 

>>> '%f' % 2.3
'2.300000'

 

실수를 넣을 때는 %f를 사용하며 고정 소수점 fixed point의 f입니다. %f는 기본적으로 소수점 이하 6자리까지 표시하므로 2.3은 2.300000으로 표시됩니다.

 

소수점 이하 자릿수를 지정하고 싶다면 다음과 같이 f 앞에 .(점)과 자릿수를 지정해주면 됩니다.

 

'%.자릿수f' % 숫자

 

>>> '%.2f' % 2.3
'2.30'
>>> '%.3f' % 2.3
'2.300'

 

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

 

이번에는 서식 지정자와 숫자를 조합하여 문자열을 정렬하는 방법을 알아보겠습니다. 다음과 같이 % 뒤에 숫자를 붙이면 문자열을 지정된 길이로 만든 뒤 오른쪽으로 정렬하고 남는 공간을 공백으로 채웁니다.

 

%길이s

 

>>> '%10s' % 'python'
'    python'

 

%10s는 문자열의 길이를 10으로 만든 뒤 지정된 문자열을 넣고 오른쪽으로 정렬합니다. 따라서 문자열 'python'은 길이가 6이므로 왼쪽 공간을 공백 4칸으로 채웁니다.

 

참고 | 자릿수가 다른 숫자 출력하기

 

문자열 오른쪽 정렬은 자릿수가 다른 숫자를 출력할 때 유용합니다. %d와 %f도 숫자와 조합하여 오른쪽으로 정렬할 수 있습니다.

 

%길이d

 

>>> '%10d' % 150
'       150'
>>> '%10d' % 15000
'     15000'

 

실수는 다음과 같이 .(점) 앞에 정렬할 길이를 지정하고, 점 뒤에 소수점 이하 자릿수를 지정합니다.

 

%길이.자릿수f

 

>>> '%10.2f' % 2.3
'      2.30'
>>> '%10.2f' % 2000.3
'   2000.30'

 

그럼 왼쪽 정렬은 어떻게 할까요? 왼쪽 정렬은 문자열 길이에 -를 붙여주면 됩니다.

 

%-길이s

 

>>> '%-10s' % 'python'
'python    '

 

%-10s는 문자열의 길이를 10으로 만든 뒤 지정된 문자열을 넣고 왼쪽으로 정렬합니다. 따라서 문자열 'python'은 길이가 6이므로 오른쪽 공간을 공백 4칸으로 채웁니다.

 

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

 

지금까지 문자열 안에 값을 한 개만 넣었는데, 값을 여러 개 넣으려면 어떻게 해야 할까요?

 

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

 

'%d %s' % (숫자, '문자열')

 

>>> 'Today is %d %s.' % (3, 'April')
'Today is 3 April.'

 

여기서는 서식 지정자가 두 개이므로 값도 두 개 넣었습니다. 이처럼 서식 지정자가 여러 개면 괄호 안의 값(변수) 개수도 서식 지정자 개수와 똑같이 맞춰주어야 합니다.

 

지금까지 서식 지정자 사이를 공백으로 띄웠습니다. 만약 서식 지정자를 서로 붙이면 결과도 붙어서 나오므로 주의해야 합니다. 다음은 3과 'April'이 붙어서 3April로 나옵니다.

 

>>> 'Today is %d%s.' % (3, 'April')
'Today is 3April.'

 

format 메서드 사용하기

 

파이썬은 문자열을 만들 때 서식 지정자 방식보다 더 간단한 문자열 포매팅(string formatting)을 제공합니다. 문자열 포매팅은 { }(중괄호) 안에 포매팅을 지정하고 format 메서드로 값을 넣습니다.

 

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

 

>>> 'Hello, {0}'.format('world!')
'Hello, world!'
>>> 'Hello, {0}'.format(100)
'Hello, 100'

 

이렇게 문자열 안에 { }를 넣고 인덱스를 지정합니다. 그리고 format에는 { } 부분에 넣을 값을 지정하면 됩니다.

 

format 메서드로 값을 여러 개 넣기

 

이번에는 값을 여러 개 넣어보겠습니다. 인덱스의 순서와 format에 지정된 값의 순서를 주목해주세요.

 

>>> 'Hello, {0} {2} {1}'.format('Python', 'Script', 3.6)
'Hello, Python 3.6 Script'

 

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

 

format 메서드로 같은 값을 여러 개 넣기

 

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

 

>>> '{0} {0} {1} {1}'.format('Python', 'Script')
'Python Python Script Script'

 

format 메서드에서 인덱스 생략하기

 

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

 

>>> 'Hello, {} {} {}'.format('Python', 'Script', 3.6)
'Hello, Python Script 3.6'

 

format 메서드에서 인덱스 대신 이름 지정하기

 

{ }에 인덱스로 순서를 지정하려니 조금 헷갈리죠? { }에 인덱스 대신 이름을 지정할 수도 있습니다.

 

>>> 'Hello, {language} {version}'.format(language='Python', version=3.6)
'Hello, Python 3.6'

 

{language}와 {version}처럼 { }에 이름을 지정했습니다. format에는 format(language='Python', version=3.6)과 같이 이름에 해당하는 값을 지정해주면 됩니다.

 

문자열 포매팅에 변수를 그대로 사용하기

 

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

 

>>> language = 'Python'
>>> version = 3.6
>>> f'Hello, {language} {version}'
'Hello, Python 3.6'

 

참고 | 중괄호 출력하기

 

{ } 중괄호 자체를 출력할 때는 {{, }}처럼 중괄호를 두 번 사용하면 됩니다.

 

>>> '{{ {0} }}'.format('Python')
'{ Python }'

 

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

 

지금까지 문자열의 서식 지정자나 ljust, rjust, center로 정렬을 했죠? 문자열 포매팅도 문자열을 정렬할 수 있습니다. 다음과 같이 인덱스 뒤에 :(콜론)을 붙이고 정렬할 방향과 길이를 지정해주면 됩니다.

 

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

 

>>> '{0:<10}'.format('python')
'python    '

 

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

 

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

 

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

 

>>> '{0:>10}'.format('python')
'    python'

 

참고로 인덱스를 사용하지 않는다면 :(콜론)과 정렬 방법만 지정해도 됩니다.

 

>>> '{:>10}'.format('python')
'    python'

 

숫자 개수 맞추기

 

그럼 이번에는 정수와 실수 앞에 0을 넣어서 숫자 개수를 맞추는 방법을 알아보겠습니다.

 

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

 

'%0개수d' % 숫자

'{인덱스:0개수d'}'.format(숫자)

 

>>> '%03d' % 1
'001'
>>> '{0:03d}'.format(35)
'035'

 

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

 

'%0개수.자릿수f' % 숫자

'{인덱스:0개수.자릿수f'}.format(숫자)

 

>>> '%08.2f' % 3.6
'00003.60'
>>> '{0:08.2f}'.format(150.37)
'00150.37'

 

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

 

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

 

문자열 포매팅은 채우기와 정렬을 조합해서 사용할 수 있습니다. 다음과 같이 { }에 인덱스, 채우기, 정렬, 길이, 자릿수, 자료형 순으로 지정해줍니다.

 

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

 

그럼 길이를 10으로 만든 뒤 왼쪽, 오른쪽으로 정렬하고 남는 공간은 0으로 채워보겠습니다.

 

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

 

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

 

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

 

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

 

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

 

문자열 메서드와 서식 지정자, 문자열 포매팅은 분량이 많지만 필요한 부분만 익혀서 사용하면 되고 모두 외우지 않아도 됩니다. 이 부분은 파이썬을 사용하다 보면 자연스럽게 익히게 됩니다.

 

참고 | 금액에서 천단위로 콤마 넣기

 

숫자 중에서 금액은 천단위로 ,(콤마)를 넣죠? 파이썬에서는 간단하게 천단위로 콤마를 넣을 수 있습니다.

 

먼저 format 내장 함수를 사용하는 방법입니다. 다음과 같이 format 함수에 숫자와 ','를 넣어줍니다.

 

format(숫자, ',')

 

>>> format(1493500, ',')
'1,493,500'

 

format 함수는 서식 지정자와 함께 사용할 수 있습니다. 다음은 콤마를 넣은 숫자를 오른쪽 정렬합니다.

 

>>> '%20s' % format(1493500, ',')    # 길이 20, 오른쪽으로 정렬
'           1,493,500'

 

포매팅에서 콤마를 넣으려면 다음과 같이 :(콜론)뒤에 ,(콤마)를 지정하면 됩니다.

 

>>> '{0:,}'.format(1493500)
'1,493,500'

 

만약 정렬을 하고 싶다면 정렬 방향과 길이 뒤에 콤마를 지정해줍니다.

 

>>> '{0:>20,}'.format(1493500)     # 길이 20, 오른쪽으로 정렬
'           1,493,500'
>>> '{0:0>20,}'.format(1493500)    # 길이 20, 오른쪽으로 정렬하고 남는 공간은 0으로 채움
'000000000001,493,500'

 

 

파이선 서식 지정자와 출력 포맷팅

 

 

 

 

반응형