1. 포맷팅 Last updated: 2023-10-17 10:30:18

포맷팅은 변수를 이용해 문자열을 생성하는 방식이다. 정해진 정적 문자열이 아니라, 상황에 따라 값이 바뀌는 변수를 활용해 문자열을 생성하는 방식으로, 파이썬에서 제공하는 방식들에 대해 설명한다.

1.1 다양한 포맷 형식

A. % 기호 이용 문자성

문자열 중에 변수로 입력될 부분을 %{변수형}으로 지정하고, 문자열이 뒤에 %로 구분하고 값을 입력한다. 변수가 한 개일 경우는 변수에 ( )가 없어도 되지만, 두 개 이상 변수일 경우 (변수1, 변수2, …)와 같이 tuple 형태로 입력한다. 다음은 숫자 변수를 이용한 포매팅의 예제들이다.

[예제 6- 1] 정수 이용 포매팅하기

n = 123.7
str_out = "%d" % n
print(str_out)

[결과]

'123'

포맷 문자열에서 %d는 정수 문자열을 생성하는 것이다. n값이 123.7로 실수이지만 정수로 표시된다.


[예제 6- 2] round( ) 이용 정수 포매팅하기

n = 123.7
str_out = "%d" % round(n)
print(str_out)

[결과]

'124'

정수 포매팅에서 소수점 이하는 절사가 된다. 만약 반올림을 하려면 round( ) 함수를 사용해서 정수 값을 바꾸어 전달해야 한다.


[예제 6- 3] 실수 이용 포매팅하기

n = 123
str_out = "%f" % n
print(str_out)

[결과]

'123.000000'

변수값을 입력 받아 실수(float) 형식으로 문자열을 생성한다. %f는 실수 형식으로 표현하는 기호이다.

다음은 사용 변수가 여러 개일 때의 예제이다.


[예제 6- 4] 변수 여러 개 사용하여 포매팅하기

m = 123
n = 456

# 변수 2개 이상일 때 꼭 ( ) 사용
str_out = "%f, %f" % (m, n)
print(str_out)

[결과]

'123.000000, 456.000000'

변수가 두개 이상인 경우에는 괄호를 이용해 튜플 형태로 (m, n)과 같이 순서대로 전달한다.


[예제 6- 5] 두개 이상 정수와 실수 포매팅하기

m = 123
n = 456

str_out = "m is %d, n is %f" % (m, n)
print(str_out)

[결과]

'm is 123, n is 456.000000'

정수와 실수를 동시에 입력하는 것도 물론 가능하다.



B. format( ) 함수 이용 문자성

파이썬 내장 함수인 format( )을 이용하는 방법도 있다. C++ 문법에서도 포맷팅을 위해 비슷한 format( ) 함수를 제공하지만 사용하는 방법은 조금 다르다. C++에서는 포맷 문자열도 함께 파라미터로 전달하지만, 파이썬에서 제공하는 format( ) 함수는 문자열에 속한 함수라고 생각하면 된다. 사용하는 방식은 문자열 내에 변수값이 들어갈 위치에 중괄호 ‘{}’를 위치시킨다. 괄호 안에는 비어 있는 경우 기본값으로, 있는 경우 옵션에 따라 출력 결과가 달라진다. 중괄호 안의 index 순서는 상관 없다. 단, format( ) 함수의 입력 값에 해당하는 index를 고려해 입력해야 한다.

형식

"{} {}".format(arg1, arg2)
"{0} {1}".format(arg1, arg2)

설명

인자를 이용해 문자열을 생성하는 방법이다. 인자가 들어갈 부분을 앞에서부터 순서대로 중괄호({ })를 추가하고 실제 값은 format( ) 함수에 인자로 넘겨주면 된다. 중괄호{ }를 비워 둬도 되고, 순서를 의미하는 인덱스를 추가 추가해도 된다.
{}의 숫자는 format( ) 함수의 인자 순서를 나타낸다. {0}은 첫 번째 인자, {1}은 두 번째 인자에 해당한다.

예제

"{}은 {}입니다.".format("이름", "홍길동")
> "이름은 홍길동입니다."

"{1}은 {0}입니다.".format("홍길동", "이름")
> "이름은 홍길동입니다."

[예제 6- 6] format( ) 함수 이용 문자열 포매팅하기

# index 없이 입력을 받음
str_out = "{} is bigger than {}".format(123, 45)
print(str_out)

[결과]

'123 is bigger than 45'

[예제 6- 7] index 이용한 format( ) 함수 사용하기

# 파리미터 index를 입력
str_out = "{0} is bigger than {1}".format(123, 45)
print(str_out)

[결과]

'123 is bigger than 45'

format( ) 함수에서 {} 사이에 index를 지정할 수 있다. Index는 format( ) 함수의 인자 순서이다.


[예제 6- 8] format( ) 함수의 index를 마음대로 사용하기

# "" 문자열 내의 index는 순서를 바꾸는것도 가능
str_out = "{0} is bigger than {1}, {1} is smaller than {0}".format(123, 45)

[결과]

'123 is bigger than 45, 45 is smaller than 123'

format( ) 함수에서 index는 인자의 순서이므로 이를 이용해 다양한 문자열을 만들 수 있다. Index를 여러번 사용할 수도 있고, 순서를 뒤바꿔도 된다.


[예제 6- 9] 공백을 앞에 추가해 정수 문자열 길이 맞추기

# 정수형의 문자열 길이 지정
"{0:10d}".format(123456)

[결과]

'    123456'

정수의 문자열 길이를 입력하면 숫자 앞에 공백을 추가해서 문자열 길이를 맞게 생성한다. 옵션 형식은 ":문자열길이d" 이다.


[예제 6- 10] 0을 앞에 추가해 정수 문자열 길이 맞추기

# 정수형 앞에 0 추가
"{0:010d}".format(123456)

[결과]

'0000123456'

공백 대신 숫자0을 앞에 추가해 문자열을 길이에 맞게 생성할 수 있다. 옵현 형식은 “:0문자열길이d” 이다.


index 자료형 별로 옵션 지정하기

입력 변수값들 마다 자리수나 자료형 등을 지정할 수 있습니다. 옵션은 index번호 뒤에 콜론(:)을 붙이고, 그 뒤에 입력합니다.

형식

"{index:option} {}".format(arg1)

설명

• index (int) : 순서를 나타내는 인덱스로 0부터 시작
• option (string) : 변수 값을 출력하는 형식을 표현하는 문자열

다음은 정수값을 이용해 옵션을 지정해 문자열을 만드는 예제이다.


[예제 6- 11] 실수 소수점 이하 길이 지정하기

"{0:0.4f}".format(10.123456)

[결과]

'10.1235'

실수형의 문자열 길이 지정, 소수점 이하 2자리까지 표시, 소수 5자리에서 반올림된다.



C. f-string 문자 포매팅

f-string은 파이썬 3.6에서 문자열을 포맷팅하기 위해 추가된 기능이다. 이전 방법에 비해 좀더 직관적이다. 사용 방법은 문자열 앞에 f 기호를 추가해 f-String이라는 것을 알려주고, 이후에는 값이 들어갈 곳에 중괄호(’{ }’)를 추가하고, 값이나 변수, 혹은 옵션을 바로 입력하면 된다.

형식

f"{value:option}"

설명

format( ) 함수를 별도로 사용하지 않고 앞에 포맷 스트링을 나타내는 f를 추가하고 이어서 문자열을 작성하고 값이나 변수가 위치할 곳에 중괄호{}를 이용해 동적인 값과 옵션을 지정한다.

예시

f"{10000:,}"
> "10,000"

f"100 x 20 = {100*20:,}"
> "10 x 20 = 2,000"

예제를 확인하면 좀 더 쉽게 이해할 수 있다.

다음은 정수값을 이용해 문자열을 생성하는 예이다.


[예제 6- 12] f-string으로 공백 추가 정수 문자열 생성하기

# [1] 정수형 앞에 공백을 추가해 10자리 문자열을 생성
f"{123456:10d}"

[결과]

'    123456'

[예제 6- 13] f-string으로 0 추가 정수 문자열 생성하기

# [2] 정수형 앞에 0을 추가해 10자리 문자열 생성
f"{12345:010d} < {67890:010d}"

[결과]

'0000012345 < 0000067890'

[예제 6- 14] 정수 변수 이용한 f-string 문자열 생성하기

# 정수형 변수를 사용해 문자열 생성
a = 1234
b = 5678
f"{a:010d} < {b:010d}"

[결과]

'0000001234 < 0000005678'

다음은 정수값을 이용해 옵션을 지정해 문자열을 만드는 예제이다.


[예제 6- 15] f-string으로 실수 문자열 생성하기

# 실수형의 문자열 길이 지정, 소수점 이하 2자리까지 표시, 소수 5자리에서 반올림
f"{10.123456:0.4f}"

[결과]

'10.1235'

[예제 6- 16] f-string으로 실수 길이와 소수점 자리수 지정하기

# 정수형 앞에 공백을 추가해 10자리를 만들고 소수점은 4자리까지 표시하는 문자열 생성
f"{10.123456:10.4f}"

[결과]

'        10.1235'

앞에서 배웠던 옵션들을 이용하면 이제 f-string을 이용해 숫자에 공백을 추가하고 소수점 자릿수를 지정해 문자열을 생성했다.



D. 자료 유형에 따른 입력 기호

입력 데이터 유형에 따라 포맷팅을 위해 사용하는 기호가 서로 다르다. 아래 표를 확인하여 필요한 기호를 참고하기 바란다.

[표 6] 자료형에 따른 포맷 입력 기호

자료형

문자 기후

입력 가능 자료형

입력 예시

정수

%d

정수
: 2진수, 8진수, 10진수, 16진수

"%d" % (0b111) → "7"
"%d" % (0o111) → "73"
"%d" % (111) → "111"
"%d" % (0x111) → "273"



실수

"%d" % (0.111) → "0"
"%d" % (1.999) → "1"



불리언

"%d" % (True) → "1"
"%d" % (False) → "0"

실수

%f

정수
:2진수, 8진수, 10진수, 16진수

"%f" % (0b111) → "7.000000"
"%f" % (0o111) → "73.000000"
"%f" % (111) → "111.000000"
"%f" % (0x111) → "273.000000"



실수

"%f" % (0.123) → "0.123000"
"%f" % (0.123456789) → "0.123457"



불리언

"%f" % (True) → "1.000000"
"%f" % (False) → "0.000000"

문자열

%s

문자열

"Welcome %s world!" % ("python") → "Welcome python world!"
"Welcome %sworld!" % ("happy" * 3) → "Welcome happy happy happy world!"



정수
: 2진수, 8진수, 10진수, 16진수

"%s points" % (0b111) → "7 points"
"%s points" % (111) → "111 points"
"%s points" % (0o111) → "73 points"
"%s points" % (0x111) → "273 points"



실수

"%s points" % (0.123) → "0.123 points"
"%s points" % (0.123456789) → "0.123456789 points"



불리언

True → "True"
False → "False"

8진수

%o

정수
: 2진수, 8진수, 10진수, 16진수

"%o points" % (0b111) → "7 points"
"%o points" % (0o111) → "111 points"
"%o points" % (111) → "157 points"
"%o points" % (0x111) → "421 points"



불리언

True → "1"
False → "0"

16진수

%x

정수
: 2진수, 8진수, 10진수, 16진수

"%x points" % (0b111) → "7 points"
"%x points" % (0o111) → "111 points"
"%x points" % (111) → "6f points"
"%x points" % (0x111) → "111 points"
"%#x points" % (0x111) → "0x111 points"



불리언

"%x" % (True) → "1"
"%x" % (False) → "0"
"%#x" % (True) → "0x1"
"%#x" % (False) → "0x0"


E. 문자열 자릿수 지정

입력되는 변수의 문자열 갯수를 지정하려면 %와 기호 사이에 숫자를 입력하면 된다. 정수형, 문자열 입력의 경우 동작한다.

형식

"%{string_length}d"

설명

• string_length (int) : 원하는 출력 문자열의 길이, 숫자가 출력 문자열 길이보다 짧은 경우 앞에 공백을 추가하여 길이가 맞도록 문자열을 생성하게 된다.

숫자형 데이터를 원하는 길이의 문자열로 생성한다.

숫자형 데이터를 원하는 길이의 문자열로 생성한다.


[예제 6- 17] 정수 문자열 생성하기

# 5자리를 갖는 정수형 문자열 생성
"%5d" % (123)

[결과]

'  123'

[예제 6- 18] 길이가 넘는 숫자의 문자열 생성하기

# [1] 5자리를 갖는 정수형 문자열 생성, 입력이 5자리를 넘어설 경우 전부 출력
"%5d" % (123456789)

[결과]

'123456789'

형식

"%{string_length}s"

설명

• string_length (int) : 원하는 출력 문자열의 길이, 숫자가 출력 문자열 길이보다 짧은 경우 앞에 공백을 추가하여 길이가 맞도록 문자열을 생성하게 된다.

문자열 데이터를 이용해 원하는 길이의 문자열로 생성한다.

문자열 데이터를 이용해 원하는 길이의 문자열로 생성한다.


[예제 6- 19] 공백 추가해 길이에 맞는 문자열 생성하기

# 10자리를 갖는 문자열 생성
"%10s" % ("Python")

[결과]

'    Python' <= 전체가 10자리

결과로 생성된 문자열이 앞에 공백을 포함해 총 10자리이다.


[예제 6- 20] 길이를 넘치는 문자열 생성하기

"%3s" % ("Python")

[결과]

'Python'

3자리를 갖는 정수형 문자열을 생성하기 위해 6자리의 문자열을 입력하면 문자가 잘려서 3자리 문자열이 생기는 것이 아니라 전체 문자가 추가된 6자리의 문자열이 생성된다.


[예제 6- 21] 길이에 맞는 문자열 생성하기

"%3s" % ("Python"[:3])

[결과]

'Pyt'

길이가 3을 넘지 않도록 문자열을 생성하려면 입력하는 문자열도 가에 맞게 잘라서 넘겨야 한다.



F. 정수 앞에 0(zero) 추가하기

정수를 입력하는 경우 앞에 0을 추가해 문자열 길이를 동일하게 표시할 때가 있다. %와 d 문자열 사이에 0으로 시작하는 자릿수를 표시한다.

형식

"%0{string_length}d"

설명

• string_length (int) : 원하는 출력 문자열의 길이, 숫자가 출력 문자열 길이보다 짧은 경우 앞에 ‘0’ 문자를 추가하여 길이가 맞도록 문자열을 생성하게 된다.

숫자 데이터를 이용해 원하는 길이의 문자열을 생성한다.

숫자 데이터를 이용해 원하는 길이의 문자열을 생성한다.


[예제 6- 22] 정수 앞에 0 추가하기

"%010d" % (123)

[결과]

'0000000123'


G. 실수의 소수점 자리수 지정하기

실수인 경우 소수점 자릿수를 원하는 길이만큼 자를 수 있다. 단, 소수점을 지정하면 반올림 되는 것을 잊지 않기를 바란다.

형식

"%0.{decimal_place}f"

설명

• decimal_place (int) : 소수점 이하로 표시할 자리수

소수를 문자열로 표시한다.

실수를 문자열로 표시한다.


[예제 6- 23] 소수점 자리 제한 문자열 생성하기

"%0.3f" % (0.123456789)

[결과]

'0.123'

[예제 6- 24] 소수점 자릿수 반올림하기

# 7째 자리의 7이 반올림 된다.
"%0.6f" % (0.123456789)

[결과]

'0.123457'


H. 숫자형에 1,000 자리 쉼표 추가

숫자형인 경우 천의 자리마다 쉼표를 추가해 자릿수를 구분하려면 : 뒤에 쉼표(,)를 추가해준다.

형식

"{number:,}"

설명

• number : 숫자

1000의 자리마다 쉼표(,)를 표시한다.

1000의 자리마다 쉼표(,)를 표시한다.


[예제 6- 25] 숫자에 천단위 자릿수 표시하기

"Number is {:,}".format(123456789)

[결과]

'Number is 123,456,789'