파이썬(Python) 3 포맷팅 방식

참고한 문서: http://docs.python.org/py3k/library/string.html#format-string-syntax

파이썬 3에서 포맷팅 방식이 변경되었습니다. 3.1 까지는 % 기호가 유지 된다고 하는데, 3.2 부터는 없어진다고 합니다.

일단, 포맷팅 방식은 .fomat() 메소드를 사용하는 방식으로 변경이 되었습니다.

그리고 문자열 내에서 포맷팅하는 방식은 { } 기호를 사용하는 방식으로 변경이 되었습니다.

예를 들어보면
>>> 'Python is {}'.format('good')
'Python is good'
와 같이 사용을 하면 됩니다. 그리고 순서를 사용해서 포맷팅을 할 수도 있습니다. { } 기호 내에 숫자를 집어 넣게 되면 인자의 인덱스를 나타내게 됩니다.
>>> 'Python is {0} good {1} language'.format('very', 'programming')
'Python is very good programming language'
>>> 'Python is {1} good {0} language'.format('programming', 'very')
'Python is very good programming language'
또, 함수의 인자처럼 키워드를 사용해서 나타낼 수도 있습니다. 예를 들어
>>> '{item} is {color}'.format(item='Apple', color='red')
'Apple is red'
>>> dic = {'item' : 'Apple', 'color' : 'red'}
>>> '{0[item]} is {0[color]}'.format(dic)
'Apple is red'
위 방식은 { } 기호 내에 키워드를 집어넣은 것이고, 아래 방식은 사전 객체를 0에 포맷팅 시켜서 사전 내에 있는 item 키와 color 키의 값들을 매칭 시킨 방식입니다.

그리고 포맷팅을 쓰다 보면 S.format(*args, **kwargs) 라고 나오는데, 함수의 인자와 비슷한 형태를 취하고 있습니다.

즉, 함수의 인자처럼 사용할 수 있다는 것입니다.
>>> t = ('very', 'programming')
>>> 'Python is {0} good {1} language'.format(*t)
'Python is very good programming language'
함수에 인자를 * 기호를 주면서 넣게 되면 리스트나 튜플로 인식하 듯이 포맷팅에도 위와 같이 사용할 수 있습니다.

따라서, ** 기호를 사용하면 사전 객체를 사용할 수 있습니다.

또, ! 기호를 사용해서 문자열의 방식을 지정해 줄 수 있습니다. ! 뒤에 s, r, a 가 붙을 수 있는데, s 는 srt(), r은 repr(), a 는 ascii() 를 의미 합니다.

여기서 ascii() 는 repr 과 마찬가지로 출력할 수 있는 문자열을 리턴 해주는데, 조금 다른 점은 이스케이프 문자(\x, \u)도 같이 표현해준다는 것입니다.
>>> 'Python is {0!r} good {1!r} language'.format('very', 'programming')
"Python is 'very' good 'programming' language"
이제 : 기호를 사용해서 고급 포맷팅 방식으로 문자열의 폭이나 정렬들을 처리하는 방법을 설명하겠습니다.

일단, : 뒤에 숫자가 오면 문자열의 폭을 지정해주게 됩니다.
>>> 'Python is {:15}'.format('good')
'Python is good           '
>>> 'Python is {:^15}'.format('good')
'Python is      good      '
위에서 처럼 15를 사용하면 15자리를 폭을 생성하게 됩니다. 아래에서는 ^ 기호를 추가해 주었는데, 이것은 가운데 정렬을 의미합니다. ^ 기호 외에도 < 는 왼쪽(기본), > 는 오른쪽, = 는 부호와 숫자 사이에 공백을 표시하라는 의미 입니다.
>>> '15 is {:=+10}'.format(15)
'15 is +       15'
>>> '15 is {:+10}'.format(15)
'15 is        +15'
= 의 경우 위의 예제를 보면 의미를 알 수 있습니다. 그리고 수자 앞에 부호나 공백을 쓸 수도 있습니다.

+ 기호를 쓰면 양수, 음수 모두 부호 표시, - 기호는 음수에만 부호 표시(기본), 공백은 양수일 때는 공백 유지, 음수일 때는 부호 표시를 나타냅니다.
>>> '15 is {:@>+10}'.format(15)
'15 is @@@@@@@+15'
>>> '15 is {:@>-10}'.format(15)
'15 is @@@@@@@@15'
>>> '15 is {:@> 10}'.format(15)
'15 is @@@@@@@ 15'
>>> '15 is {:@>+10}'.format(-15)
'15 is @@@@@@@-15'
>>> '15 is {:@>-10}'.format(-15)
'15 is @@@@@@@-15'
>>> '15 is {:@> 10}'.format(-15)
'15 is @@@@@@@-15'
위의 예를 보면 이해를 할 수 있는데, : 바로 다음에 문자를 표시해주게 되면 공백은 그 문자로 채우게 할 수 있습니다.
(단, } 문자는 안됩니다.)

이때, 주의할 점은 공백을 채울 문자를 쓰게 되면 반드시 정렬 부호를 표시해주어야 합니다. 즉, 기본 상태인 < 부호도 반드시 써주어야 합니다. 그렇지 않으면 에러를 띠우게 됩니다.

다음으로 폭을 표시해주는 숫자 앞에 0을 써주게 되면 정렬 문자인 = 과 공백 채움 문자를 0 을 쓴 것과 같은 효과를 가집니다.
>>> '15 is {:0=10}'.format(15)
'15 is 0000000015'
>>> '15 is {:010}'.format(15)
'15 is 0000000015'
>>> '15 is {:0=10}'.format(-15)
'15 is -000000015'
>>> '15 is {:010}'.format(-15)
'15 is -000000015'

그리고 # 를 사용하면 2진, 8진 16진 표시를 할 때 숫자 앞에 0b, 0o, 0x 를 나타낼 수 있습니다.
>>> '15 is {:#10b}'.format(15)
'15 is     0b1111'
>>> '15 is {:#10o}'.format(15)
'15 is       0o17'
>>> '15 is {:#10x}'.format(15)
'15 is        0xf'

또, 숫자 다음에 , 기호를 사용해주면 천 단위로 , 를 표시해줍니다.
>>> '1234567890 is {:10,}'.format(1234567890)
'1234567890 is 1,234,567,890'
다음으로 숫자 뒤에 문자를 써주게 되면 숫자 표현 방식을 지정해줄 수 있습니다.
>>> '1234567890 is {:10e}'.format(1234567890)
'1234567890 is 1.234568e+09'
>>> '1234567890 is {:10f}'.format(1234567890)
'1234567890 is 1234567890.000000'
>>> '1234567890 is {:10%}'.format(1234567890)
'1234567890 is 123456789000.000000%'
이 외에도 여러가지 문자가 있는데, 정수 타입에서 b 는 2진 표시, c 는 문자 표시, d 는 10진 표시, o 는 8진 표시, x 는 16진 소문자 표시, X 는 16진 대문자 표시, n 은 현재 locale 에 적용된 분리 문자를 사용한다는 점을 빼고는 d 와 같고, 아무 것도 안 썼을 때는 d 와 같다.

문자열 타입에선 s 는 문자열 포맷이고 기본 타입이다. 아무 것도 안 썼을 때는 s 와 같다.

소수 타입에선 e 는 소문자 지수 표현, E 는 대문자 지수 표현, f 는 고정 소수점, F 는 f와 같은데, nan 을 NAN, inf를 INF로 표시한다. g 는 일반적이 포맷 방식인데, 크기나 유효숫자에 따라서 고정 소수점이나 e 표현을 사용한다. G 는 g와 같고, e 대신 E 를 사용한다. n 은 g 와 같은데, 분리 문자를 사용한다. % 는 숫자에 100을 곱한 후 % 문자 사용.

아무 것도 없을 때는 g와 같지만 소수점 왼쪽에 적어도 한 개의 숫자와 12개의 유효숫자를 사용한다.

여기서 g 타입과 n 타입이 조금 혼동 되는데, g 타입은 조금 복잡한 규칙을 사용하므로 문서를 직접 참고 바란다.

n 타입은 locale 모듈에 세팅된 상태에 의존한다.
>>> '1234567890 is {:n}'.format(1234567890)
'1234567890 is 1234567890'
>>> import locale
>>> a = locale.getlocale()
>>> a
('ko_KR', 'UTF8')
>>> locale.setlocale(locale.LC_NUMERIC, a)
'ko_KR.UTF8'
>>> '1234567890 is {:n}'.format(1234567890)
'1234567890 is 1,234,567,890'

마지막으로 숫자가 소수 타입이거나 소수 형식의 표현(f, g ...)일 때 . 기호와 숫자를 사용하면 소수점 이후 숫자의 개수를 지정할 수 있습니다.(즉, 정수는 안됨.) 만약, 지정하지 않게 되면 나타낼 수 있는 최대 크기에 맞게 출력이 됩니다.
>>> '0.12345678901234567890 is {:.3}'.format(0.12345678901234567890)
'0.12345678901234567890 is 0.123'
>>> '0.12345678901234567890 is {:.7}'.format(0.12345678901234567890)
'0.12345678901234567890 is 0.1234568'
>>> '0.12345678901234567890 is {:}'.format(0.12345678901234567890)
'0.12345678901234567890 is 0.123456789012'
>>> '0.12345678901234567890 is {:.20}'.format(0.12345678901234567890)
'0.12345678901234567890 is 0.12345678901234567737'

지금까지 고급 포맷팅 방식을 조금 복잡하게 설명을 했는데, 정리를 하자면 아래와 같이 포맷팅을 하면 됩니다.

이때, 순서가 옳바르지 않으면 에러를 일으킵니다.

format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
fill ::= <a character other than '}'>
align ::= "<" | ">" | "=" | "^:
sign ::= "+" | "-" | " "
width ::= integer
precision ::= integer
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

마지막으로 format() 내장 함수가 있는데, 이것은 문자나 숫자를 포맷팅 형식으로 바꾸어 주는 함수입니다.
>>> format(1234567890, '+030,')
'+0,000,000,000,001,234,567,890'

댓글 1개:

  1. 으악 왜 %d 이게 안되나 한참 헤매고 있었는데
    덕분에 해결했습니다 ㅜㅜ 감사합니다

    답글삭제