문자열 포매팅

  • 문자열에서 또 하나 알아야 할 것으로는 ‘문자열 포매팅(string formatting)이 있음
  • 예를 들어, 아래의 두 문장이 있다고 가정하였을 때,
    • “현재 온도는 18도 입니다.”
    • “현재 온도는 20도 입니다.”
  • 두 문자열은 모두 같은데 20이라는 숫자와 18이라는 숫자만 다름!
  • 이렇게 문자열 안의 특정한 값을 바꿔야 할 경우가 있을 때 이것을 가능하게 해주는 것이 문자열 포매팅

문자열 포매팅 사용하기

1. 숫자에 바로 대입

a = "I eat %d apples." % 3

print(a)  # I eat 3 apples.
  • 위 예제는 문자열 안에 정수 3을 삽입하는 방법을 보여줌
  • 문자열 안의 숫자를 넣고 싶은 자리에 %d 문자를 넣어주고 삽일할 숫자 3은 가장 뒤에 있는 % 문자 다음에 써 넣음
  • 여기에서 %d는 ‘문자열 포맷 코드’라고 부름

2. 문자열 바로 대입

  • 문자열 안에 꼭 숫자만 넣어야 할 필요는 없음! 문자열을 넣을 수도 있음

      a = "I eat %s apples." %'five'
        
      print(a)   # I eat five apples.
    
  • 문자열 안에 또 다른 문자열을 삽입하기 위해서는 %d가 아닌 %s 를 써야함

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

number = 3
a = "I eat %d apples." % number

print(a)  # I eat 3 apples.
  • 1번처럼 숫자를 바로 대입하든, 숫자 값을 나타내는 변수를 대입하든 결과는 같음

4. 2개 이상의 값 넣기

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

print(a)   # 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 포맷 코드는 어떤 형태의 값이든 변환해서 넣을 수 있음!

      a = "I have %s apples" % 3
      b = "rate is %s" % 3.234
        
      print(a)   # I have 3 apples
      print(b)   # rate is 3.234
    
    • 3을 문자열 안에 삽입하려면 %d , 3.234를 삽입하려면 %f 를 사용해야 함
    • 하지만 %s를 사용하면 %s는 자동으로 %뒤에 있는 값을 문자열로 바꾸어 대입함!

포매팅 연산자 %d와 %을 같이 쓸 때는 %%을 사용

e = "Error is %d%." % 98
  • 결과 값이 “Error is 98%.”가 출력될 것이라고 생각하지만 파이썬은 ‘형식이 불완전하다’라는 오류 메세지를 보여줌

      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      ValueError: incomplete format
    
  • 그 이유는 ‘문자열 포맷 코드인 %d와 %가 같은 문자열 안에 존재하는 경우, %를 나타내기 위해서는 반드시 %%을 사용해야함!

      e = "Error is %d%%." % 98
        
      print(e)   # Error is 98%.
    
    • 포맷팅 연산자가 없다면 %만 사용하면 그대로 출력됨!

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

1. 정렬과 공백

a = "%10s" % "hi"  
print(a)   #         hi
  • %10s 는 전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽으로 정렬하고 그 앞의 나머지는 공백으로 남겨두라는 의미

  • 빈대쪽인 왼쪽 정렬은 %-10s로 표현할 수 있음

      b = "%-10sjane." % "hi"
      print(b)   # hi        jane.
    

2. 소수점 표현하기

a = "%0.4f" % 3.42134234    
print(a)   # 3.4213
  • 3.421343234를 소수점 네 번째 자리까지만 나태니고 싶은 경우에는 위와 같이 작성
  • %0.4f 에서 ‘.’는 소수점 포인트, 그 뒤의 숫자 4는 소수점 뒤에 나올 숫자의 개수를 말함
  • 소수점 포인트 앞으 숫자는 문자열의 전체 길이를 의미하는데, %0.4f 에서 사용한 숫자 0은 길이에 상관하지 않겠다는 의미
  • 아래 예시의 경우 숫자 3.421343234를 소수점 네 번째 자리까지만 표시하고 전체 길이가 10개인 문자열 공간에서 오른쪽으로 정렬

      a = "%10.4f" % 3.42134234  
      print(a)   #     3.4213
    


format 함수를 사용한 포매팅

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

숫자/문자열 바로 대입

a = "I eat {0} apples".format(3)
b = "I eat {0} apples".format('five')
print(a)  # I eat 3 apples
print(b)  # I eat five apples
  • 문자열의 {0} 부분이 숫자 3과 문자열 ‘five’로 바뀜

변수 대입하기

number = 3
b = "I eat {0} apples".format(number)
print(b)   # I eat 10 apples
  • 문자열의 {0} 부분이 number 변수의 값인 3으로 바뀜

2개 이상의 값 넣기

number = 10
day = "three"
a = "I ate {0} apples. so I was sick for {1} days." %(number, day)
print(a)  # I ate 10 apples. so I was sick for three days.
  • 2개 이상의 값을 넣을 경우, 문자열의 {0}, {1} 과 같은 인덱스 항목이 format 함수의 입력값으로 순서에 맞게 바뀜
  • 위의 예시에서 {0}은 format 함수의 첫 번째 입력값인 number, {1}은 format 함수의 두 번째 입력값인 day로 바뀜

이름으로 넣기

a = "I ate {number} apples. so I was sick for {day} days." %(number=10, day=3)
print(a)  # I ate 10 apples. so I was sick for 3 days.
  • {0}, {1} 과 같은 인덱스 항목 대신 더 편리한 {name}의 형태를 사용하는 방법도 있음
  • {name} 형태를 사용할 경우, format 함수에는 반드시 name=value와 같은 형태의 입력값이 있어야 함

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

a = "I ate {0} apples. so I was sick for {day} days." %(10, day=3)
print(a)  # I ate 10 apples. so I was sick for 3 days.
  • 인덱스 항목과 name=value 형태를 혼용하는 것도 가능

왼쪽/가운데/오른쪽 정렬

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

print(a)   # 'hi        '
print(b)   # '    hi    '
print(c)   # '        hi'
  • :<10 표현식을 사용하면 치환되는 문자열을 왼쪽으로 정렬하고 문자열의 총 자릿수를 10으로 맞출 수 있음
  • 마찬가지로 가운데 정렬은 :^ , 오른쪽 정렬은 :> 를 사용하면 됨

공백 채우기

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

print(d)  # '====hi===='
print(e)  # 'hi!!!!!!!!'
  • 정렬할 때 공백 문자 대신 지정한 문자 값으로 채워 넣을 수 있음
  • 채워 넣을 문자 값은 정렬 문자 <, ^, > 바로 앞에 넣어야 함

소수점 표현하기

y = 3.42134234
a = "{0:0.4f}".format(y)
print(a)   # 3.4213

b = "{0:10.4f}".format(y)
print(b)   #     3.4213
  • format 함수를 사용해 소수점을 4자리까지만 표현할 수 있고, 자릿수를 10으로 맞출 수도 있음

{또는} 문자 표현하기

a = "".format()
print(a)  # { and }
  • format 함수를 사용해 문자열을 표매팅할 경우, {} 와 같은 중괄호 문자를 포매팅 문자가 아닌 문자 그대로 사용하고 싶은 경우에는 위 예의 `` 처럼 2개를 연속해서 사용하면 됨


f 문자열 포매팅

  • 파이썬 3.6 버전부터는 f 문자열 포매팅 기능을 사용할 수 있음(3.6 미만의 버전에서는 사용 불가)
  • 다음과 같이 문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능을 사용할 수 있음

      name = '이두부'
      age = 6
      say = f'나의 이름은 {name}입니다. 나이는 {age}살입니다.'
      print(say)   # 나의 이름은 이두부입니다. 나이는 6살입니다.
    
    • f 문자열 포매팅은 위와 같이 name, age와 같은 변수값을 생성한 후에 그 값을 참조할 수 있음
  • 또한 f 문자열 포매팅은 표현식을 지원하기 때문에 다음과 같이 사용할 수 있음

      age = 6
      say = f'나는 내년이면 {age + 1}살이 된다.'
      print(say)   # 나는 내년이면 7살이 된다.
    
  • 딕셔너리

      dic = {'name': '이두부', 'age':6}
      say = f'나의 이름은 {dic["name"]}입니다. 나이는 {dic["age"]}살입니다.'
      print(say)   # 나의 이름은 이두부입니다. 나이는 6살입니다.
    
  • 정렬

      a = f'{"hi":<10}'   # 왼쪽 정렬
      b = f'{"hi":^10}'   # 가운데 정렬
      c = f'{"hi":>10}'   # 오른쪽 정렬
        
      print(a)   # hi        
      print(b)   #     hi    
      print(c)   #         hi
    
  • 공백 채우기

      d = f'{"hi":=^10}'   # 가운데 정렬하고 '='로 공백 채우기
      e = f'{"hi":!<10}'   # 왼쪽 정렬하고 '!"로 공백 채우기
        
      print(d)  # ====hi====
      print(e)  # hi!!!!!!!!
    
  • 소수점

      y = 3.42134234
      a = f"{y:0.4f}"    # 소수점 4자리까지만 표현
      print(a)   # 3.4213
        
      b = f"{y:10.4f}"   # 소수점 4자리까지 표현하고 총 자리수를 '10'으로 맞춤
      print(b)   #     3.4213
    
  • f 문자열에서 {} 문자 그대로 표현하기

      a = f""
      print(a)  # { and }
    

댓글남기기