ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 02-2 문자열 자료형_4. (문자열 포매팅)
    Do it! 점프 투 파이썬 2022. 6. 2. 22:42

    문자열에서 또 하나 알아야 할 것으로는 문자열 포매팅(Formatting)이 있다. 이것을 공부하기 전에 다음과 같은 문자열을 출력하는 프로그램을 작성했다고 가정해 보자.

     

    "현재 온도는 18도입니다."

     

    시간이 지나서 20도가 되면 다음 문장을 출력한다.

     

    "현재 온도는 20도입니다."

     

    위 두 문자열은 모두 같은데 20이라는 숫자와 18이라는 숫자만 다르다. 이렇게 문자열 안의 특정한 값을 바꿔야 할 경우가 있을 때 이것을 가능하게 해주는 것이 바로 문자열 포매팅 기법이다.

    쉽게 말해 문자열 포매팅이란 문자열 안에 어떤 값을 삽입하는 방법이다. 다음 예를 직접 실행해 보면서 그 사용법을 알아보자.

     

     

    문자열 포매팅 따라 하기

    1. 숫자 바로 대입

    >>> "I eat %d apples." % 3
    'I eat 3 apples.'

    위 예제의 결괏값을 보면 알겠지만 위 예제는 문자열 안에 정수 3을 삽입하는 방법을 보여 준다. 문자열 안에서 숫자를 넣고 싶은 자리에 %d 문자를 넣어 주고, 삽입할 숫자 3은 가장 뒤에 있는 % 문자 다음에 써 넣었다. 여기에서 %d는 문자열 포맷 코드라고 부른다.

     

    2. 문자열 바로 대입

    문자열 안에 꼭 숫자만 넣으라는 법은 없다. 이번에는 숫자 대신 문자열을 넣어 보자.

    >>> "I eat %s apples." % "five"
    'I eat five apples.'

    위 예제에서는 문자열 안에 또 다른 문자열을 삽입하기 위해 앞에서 사용한 문자열 포맷 코드 %d가 아닌 %s를 썼다. 어쩌면 눈치 빠른 독자는 벌써 유추하였을 것이다. 숫자를 넣기 위해서는 %d를 써야 하고, 문자열을 넣기 위해서는 %s 써야 한다는 사실을 말이다.

     

    3. 숫자 값을 나타내는 변수로 대입

    >>> number = 3
    >>> "I eat %d apples." % number
    'I eat 3 apples.'

    1번처럼 숫자를 바로 대입하나 위 예제처럼 숫자 값을 나타내는 변수를 대입하나 결과는 같다.

     

    4. 2개 이상의 값 넣기

    그렇다면 문자열 안에 1개가 아닌 여러 개의 값을 넣고 싶을 땐 어떻게 해야 할까?

    >>> number = 10
    >>> day = "three"
    >>> "I ate %d apples. so I was sick for %s days." % (number, day)
    'I ate 10 apples. so I was sick for three days.'

    위 예문처럼 2개 이상의 값을 넣으려면 마지막 % 다음 괄호 안에 콤마(,)로 구분하여 각각의 값을 넣어 주면 된다.

     

     

     

    문자열 포맷 코드

    문자열 포매팅 예제에서는 대입해 넣는 자료형 정수와 문자열을 사용했으나 이 외에도 다양한 것을 대입할 수 있다. 문자열 포맷 코드로는 다음과 같은 것이 있다.

    코드 설명
    %s 문자열(String)
    %c 문자 1개(Character)
    %d 정수(Integer)
    %f 부동 소수(Floating-point)
    %o 8진수
    %x 16진수
    %% Literal % (문자 '%' 자체)

     

    여기에서 재미있는 것은 %s포맷 코드인데, 이 코드는 어떤 형태의 값이든 변환해 넣을 수 있다. 무슨 말인지 예를 통해 확인해 보자.

    >>> "I have %s apples" % 3
    'I have 3 apples'
    >>> "rate is %s" % 3.234
    'rate is 3.234'

    3을 문자열 안에 삽입하려면 %d를 사용하고, 3.234를 삽입하려면 %f를 사용해야 한다. 하지만 %s를 사용하면 이런 것을 생각하지 않아도 된다. 왜냐하면 %s는 자동으로 % 뒤에 있는 값을 문자열로 바꾸기 때문이다.

     

    *포매팅 연산자 %d와 %를 같이 쓸 때는 %%를 쓴다.

    >>> "Error is %d%." % 98

    위 예문은 결괏값으로 당연히 "Error is 98%."가 출력될 것이라고 예상하겠지만 파이썬은 값이 올바르지 않다는 값 오류(Value Error) 메시지를 보여 준다.

    Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
    ValueError: incomplete frmat

    이유는 문자열 포맷 코드인 %d와 %가 같은 문자열 안에 존재하는 경우, %를 나타내려면 반드시 %%로 써야 하는 법칙이 있기 때문이다. 이 점은 꼭 기억해 두어야 한다. 하지만 문자열 안에 %d 같은 포매팅 연산자가 없으면 %는 홀로 쓰여도 상관이 없다.

     

    따라서 위 예를 제대로 실행하려면 다음과 같이 해야 한다.

    >>> "Error is %d%%." % 98
    'Error is 98%.'

     

     

     

     

    포맷 코드와 숫자 함께 사용하기

    위에서 보았듯이 %d, %s 등의 포맷 코드는 문자열 안에 어떤 값을 삽입하기 위해 사용한다. 하지만 포맷 코드를 숫자와 함께 사용하면 더 유용하게 사용할 수 있다. 다음 예를 보고 따라해 보자.

     

    1. 정렬과 공백

    >>> "%10s" % "hi"
    '        hi'   <-hi가 오른쪽 정렬됨

    앞의 예문에서 %10s는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞에 나머지는 공백으로 남겨 두라는 의미이다.

    -----------------------------------------------------------------------------> 전체 길이 10개 <-----------------------------------------------------------------------------

                    h i

    -----------------------------------------------------------------> 공백 8개 <-----------------------------------------------------------------

     

    그렇다면 반대쪽인 왼쪽 정렬은 %-10s가 될 것이다. 확인해 보자.

    >>> "%-10sjane" % 'hi'
    'hi        jane'   <-hi가 왼쪽 정렬됨

    hi를 왼쪽으로 정렬하고 나머지는 공백으로 채웠음을 볼 수 있다.

    -----------------------------------------------------> 전체 길이 10개 <-----------------------------------------------------

    h i                 j a n e

                                     -------------------------------------------> 공백 8개 <-------------------------------------------

     

     

    2. 소수점 표현하기

    >>> "%0.4f" % 3.42134234
    '3.4213'

    3.42134234를 소수점 네 번째 자리까지만 나타내고 싶은 경우에는 위와 같이 사용한다. 즉 여기서 '.'의 의미는 소수점 포인트를 말하고 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수를 말한다. 다음 예를 살펴보자.

    >>> "%10.4f" % 3.42134234
    '    3.4213'

    위 예는 숫자 3.42134234를 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬하는 예를 보여 준다.

     -------------------------------------------------------------------------------> 전체 길이 10개 <-------------------------------------------------------------------------------

            3 . 4 2 1 3

    ----------------------------> 공백 4개 <----------------------------

     

     

     

     

    format 함수를 사용한 포매팅

    문자열의 format 함수를 사용하면 좀 더 발전된 스타일로 문자열 포맷을 지정할 수 있다. 앞에서 살펴본 문자열 포매팅 예제를 format 함수를 사용해서 바꾸면 다음과 같다.

     

    숫자 바로 대입하기

    >>> "I eat {0} apples".format(3)
    'I eat 3 apples'

    "I eat {0} apples" 문자열 중 {0} 부분이 숫자 3으로 바뀌었다.

     

    문자열 바로 대입하기

    >>> "I eat {0} apples".format("five")
    'I eat five apples'

    문자열의 {0} 항목이 five라는 문자열로 바뀌었다.

     

    숫자 값을 가진 변수로 대입하기

    >>> number = 3
    >>> "I eat {0} apples".format(number)
    'I eat 3 apples'

    문자열의 {0} 항목이 number 변수 값인 3으로 바뀌었다.

     

    2개 이상의 값 넣기

    >>> number = 10
    >>> day = "three"
    >>> "I ate {0} apples. so I was sick for {1} days.".format(number, day)
    "I ate 10 apples. so I was sick for three days.'

    2개 이상의 값을 넣을 경우 문자열으 {0}, {1}과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀐다. 즉 위 예에서 {0}은 format 함수의 첫 번째 입력값인 number로 바뀌고 {1}은 format 함수의 두번째 입력값인 day로 바뀐다.

     

    이름으로 넣기

    >>> "I ate {number} apples. so I was sick for {day} days.".format(number=10, day=3)
    'I ate 10 apples. so I was sick for 3 days.'

    위 예에서 볼 수 있듯이 {0}, {1}과 같은 인덱스 항목 대신 더 편리한 {name} 형태를 사용하는 방법도 있다. {name} 형태를 사용할 경우 format 함수에는 반드시 name=value와 같은 형태의 입력값이 있어야만 한다. 위 예는 문자열의 {number}, {day}가 format 함수의 입력값인 number=10, day=3 값으로 각각 바뀌는 것을 보여 주고 있다.

     

    인덱스와 이름을 혼용해서 넣기

    >>> "I ate {0} apples. so I was sick for {day} days.".format(10, day=3)
    'I ate 10 apples. so I was sick for 3 days.'

    위와 같이 인덱스 항목과 name=value 형태를 혼용하는 것도 가능하다

     

    왼쪽 정렬

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

    :<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있다.

     

    오른쪽 정렬

    >>> "{0:>10}".format("hi"
    '        hi'

    오른쪽 정렬은 :< 대신 :>을 사용하면 된다. 화살표 방향을 생각하면 어느 쪽으로 정렬되는지 바로 알 수 있을 것이다.

     

    가운데 정렬

    >>> "{0:^10}".format("hi"
    '    hi    '

    :^ 기호를 사용하면 가운데 정렬도 가능하다.

     

    공백 채우기

    >>> "{0:=^10}".format("hi")
    '====hi===='
    >>> "0:!<10}".format("hi")
    'hi!!!!!!!!'

    정렬할 때 공백 문자 대신에 지정한 문자 값으로 채워 넣는 것도 가능하다. 채워 넣을 문자 값은 정렬 문자 <, >, ^ 바로 앞에 넣어야 한다. 위 예에서 첫 번째 예제는 가운데(^)로 정렬하고 빈 공간을 = 문자로 채웠고, 두 번째 예제는 왼쪽(<)으로 정렬하고 빈 공간을 ! 문자로 채웠다.

     

    소수점 표현하기

    >>> y = 3.42134234
    >>> "{0:0.4f}".format(y)
    '3.4213'

    위 예는 format 함수를 사용해 소수점을 4자리까지만 표현하는 방법을 보여 준다. 앞에서 살펴보았던 표현식 0.4f를 그대로 사용한 것을 알 수 있다.

    >>> "{0:104f}".format(y)
    '    3.4213'

    위와 같이 자릿수를 10으로 맞출 수도 있다. 역시 앞에서 살펴본 10.4f의 표현식을 그대로 사용한 것을 알 수 있다.

     

    { 또는 } 문자 표현하기

    >>> "{{ and }}". format()
    '{ and }'

    format 함수를 사용해 문자열 포매팅을 할 경우 { }와 같은 중괄호(brace) 문자를 포매팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는 위 예의 {{ }}처럼 2개를 연속해서 사용하면 된다.

     

     

     

     

    f 문자열 포매팅

    파이썬 3.6버전부터는 f 문자열 포매팅 기능을 사용할 수 있다. 파이썬 3.6 미만 버전에서는 사용할 수 없는 기능이므로 주의해야 한다.

    다음과 같이 문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능을 사용할 수 있다.

    >>> name = '홍길동'
    >>> age = '30'
    >>> f'나의 이름은 {name}입니다. 나이는 {age}입니다.'
    '나의 이름은 홍길동입니다. 나이는 30입니다.'

    f 문자열 포매팅은 위와 같이 name, age와 같은 변수 값을 생성한 후에 그 값을 참조할 수 있다. 또한 f 문자열 포매팅은 표현식을 지원하기 때문에 다음과 같은 것도 가능하다.

    (표현식이란 문자열 안에서 변수와 +, -와 같은 수식을 함께 사용하는 것을 말한다.)

    >>> age = 30
    >>> f'나는 내년이면 {age+1}살이 된다.'
    '나는 내년이면 31살이 된다.'

     

    딕셔너리는 f 문자열 포매팅에서 다음과 같이 사용할 수 있다.

    >>> d = {'name':'홍길동', 'age':30}
    >>> f'나의 이름은 {d["name"]}입니다. 나이는 {d["age"]}입니다.'
    '나의 이름은 홍길동입니다. 나이는 30입니다.'

     

    정렬은 다음과 같이 할 수 있다.

    >>> f'{"hi":<10}'   <- 왼쪽 정렬
    'hi        '
    >>> f'{"hi":>10}'   <- 오른쪽 정렬
    '        hi'
    >>> f'{hi":^10}'   <- 가운데 정렬
    '    hi    '

     

    공백 채우기는 다음과 같이 할 수 있다.

    >>> f'{"hi":=^10}'   <-가운데 정렬하고 = 문자로 공백 채우기
    '====hi===='
    >>> f'{"hi":!<10}'   <- 왼쪽 정렬하고 ! 문자로 공백 채우기
    'hi!!!!!!!!'

     

    소수점은 다음과 같이 표현할 수 있다.

    >>> y = 3.42134234
    >>> f'{y:0.4f}'   <- 소수점 4자리까지만 표현
    '3.4213'
    >>> f'{y:10.4f}'   <- 소수점 4자리까지 표현하고 총 자릿수를 10으로 맞춤
    '    3.4213'

     

    f 문자열에서 { } 문자를 표시하려면 다음과 같이 두 개를 동시에 사용해야 한다.

    >>> f'{{ and }}'
    '{ and }

     

     

     

    format 함수 또는 f 문자열 포매팅을 사용해 '!!!python!!!' 문자열을 출력해 보자.

    정답 ) "{0:!^12}".format('python') 또는 f'{"python":!^12}'

     

    지금까지는 문자열을 가지고 할 수 있는 기본적인 것에 대해 알아보았다. 이제부터는 문자열을 좀 더 자유자재로 다루기 위해 공부해야 할 것을 설명할 것이다.

     

     

     

     

     

    출처 : "점프 투 파이썬"

Designed by Tistory.