Python 3에서 문자열 포매터 사용하는 방법

###소개

파이썬의 str.format() 메서드는 문자열 클래스의 변수 치환 및 값 형식화를 수행할 수 있게 해줍니다. 이를 통해 위치 지정 형식을 사용하여 문자열 내에서 요소를 함께 연결할 수 있습니다.

이 튜토리얼은 파이썬에서 형식 지정자의 일반적인 사용 사례를 안내하여 코드와 프로그램을 보다 가독성 있고 사용자 친화적으로 만드는 데 도움이 될 것입니다.

전제 조건

컴퓨터 또는 서버에 Python 3가 설치되어 있고 프로그래밍 환경이 설정되어 있어야 합니다. 프로그래밍 환경이 설정되어 있지 않은 경우 운영 체제에 적합한 로컬 프로그래밍 환경 또는 서버에 프로그래밍 환경을 설정하는 방법을 설치 및 설정 가이드를 참조할 수 있습니다(Ubuntu, CentOS, Debian 등).

##형식 지정자 사용하기

형식 지정자는 하나 이상의 대체 필드 또는 자리 표시자를 문자열에 넣고 {}로 정의된 것을 호출하는 방식으로 작동합니다. 그런 다음 str.format() 메소드를 호출합니다. 이 메소드에는 문자열과 연결할 값을 전달합니다. 이 값은 프로그램을 실행할 때 자리 표시자가 위치한 곳과 동일한 위치로 전달됩니다.

포매터를 사용하는 문자열을 출력해 봅시다:

정보:이 튜토리얼의 예제 코드를 따라 하려면 python3 명령을 실행하여 로컬 시스템에서 Python 대화형 셸을 엽니다. 그런 다음 >>> 프롬프트 뒤에 예제를 추가, 복사 또는 붙여 넣을 수 있습니다.

print("Sammy has {} balloons.".format(5))
Output
Sammy has 5 balloons.

위의 예에서 중괄호 쌍을 자리 표시자로 사용하여 문자열을 구성했습니다:

"Sammy has {} balloons."

그런 다음 str.format() 메소드를 추가하고 해당 메소드에 정수 5의 값을 전달했습니다. 이렇게 하면 중괄호 자리에 5의 값이 들어갑니다:

Sammy has 5 balloons.

또한 포매터 자리 표시자 값으로 변수를 할당할 수도 있습니다:

open_string = "Sammy loves {}."
print(open_string.format("open source"))
Output
Sammy loves open source.

두 번째 예에서는 큰 문자열에 문자열 "open source"을 연결하고 원래 문자열의 중괄호를 대체했습니다.

파이썬의 포매터를 사용하면 str.format() 메소드를 통해 전달할 값에 대한 자리 표시자로 중괄호를 사용할 수 있습니다.

##다중 자리 표시자와 함께 포매터 사용

중괄호 포매터를 사용할 때 여러 개의 중괄호 쌍을 사용할 수 있습니다. 위 문장에 또 다른 변수 치환을 추가하려면 두 번째 중괄호 쌍을 추가하고 메서드에 두 번째 값을 전달함으로써 수행할 수 있습니다:

new_open_string = "Sammy loves {} {}."                      #2 {} 플레이스홀더
print(new_open_string.format("open-source", "software"))    #콤마로 구분된 두 문자열을 메서드에 전달합니다.
Output
Sammy loves open-source software.

또 다른 치환을 추가하기 위해 원래 문자열에 두 번째 중괄호 쌍을 추가했습니다. 그런 다음, 우리는 두 개의 문자열을 str.format() 메서드에 쉼표로 구분하여 전달했습니다.

동일한 구문을 따라, 추가적인 치환을 추가할 수 있습니다:

sammy_string = "Sammy loves {} {}, and has {} {}."                      #4 {} 플레이스홀더
print(sammy_string.format("open-source", "software", 5, "balloons"))    #메서드에 4개의 문자열 전달
Output
Sammy loves open-source software, and has 5 balloons.

sammy_string에서는 변수 치환을 위한 4쌍의 중괄호를 추가했습니다. 그런 다음, 문자열과 정수 데이터 유형을 혼합하여 str.format() 메서드에 4개의 값을 전달했습니다. 이러한 각 값은 쉼표로 구분됩니다.

##위치 및 키워드 인수를 사용하여 포매터 재정렬하기

중괄호를 매개변수 없이 비워둘 때, Python은 str.format() 메서드를 통해 전달된 값으로 순서대로 값을 대체합니다. 지금까지 본 것처럼, 두 개의 빈 중괄호 쌍과 두 개의 값을 통과하는 포매터 구성은 다음과 같습니다:

print("Sammy the {} has a pet {}!".format("shark", "pilot fish"))
Output
Sammy the shark has a pet pilot fish!

첫 번째 중괄호 쌍은 "shark"의 문자열 값으로 대체되고, 두 번째 쌍은 "pilot fish"의 문자열 값으로 대체됩니다.

메서드 내에 존재하는 값은 다음과 같습니다:

("shark", "pilot fish")

본질적으로 튜플 데이터 유형이며, 튜플에 포함된 각 개별 값은 인덱스 번호로 호출할 수 있으며, 이는 인덱스 번호 0에서 시작합니다.

이러한 인덱스 번호를 원래 문자열의 자리 표시자로 작동하는 중괄호에 전달할 수 있습니다:

print("Sammy the {0} has a pet {1}!".format("shark", "pilot fish"))

위 예에서는 중괄호에 인덱스 번호를 전달하지 않고 튜플의 값을 순서대로 호출하기 때문에 출력이 됩니다:

Output
Sammy the shark has a pet pilot fish!

그러나, 자리 표시자의 매개 변수로 인덱스 번호를 반대로 지정하면 문자열에 전달되는 값을 반대로 할 수 있습니다:

print("Sammy the {1} has a pet {0}!".format("shark", "pilot fish"))
Output
Sammy the pilot fish has a pet shark!

튜플에서 인덱스 위치 0과 1에 값이 있는데 2의 인덱스 번호를 호출하면 범위를 벗어나게 됩니다. 범위를 벗어난 인덱스 번호를 호출하면 오류 메시지가 표시됩니다:

print("Sammy the {2} has a pet {1}!".format("shark", "pilot fish"))
Output
IndexError: tuple index out of range

표시되는 오류 메시지는 튜플에 인덱스 번호 0과 1에만 값이 있다는 것을 나타내며, 따라서 인덱스 번호 2가 범위를 벗어난 것입니다:

자리 표시자를 몇 개 더 추가하고 전달할 값도 몇 개 더 추가하여 어떻게 서식 지정자를 재배치할 수 있는지 이해해 봅시다. 먼저, 다음은 네 개의 자리 표시자가 있는 새 문자열입니다:

print("Sammy is a {}, {}, and {} {}!".format("happy", "smiling", "blue", "shark"))
Output
Sammy is a happy, smiling and blue shark!

매개 변수 없이 str.format() 메서드에 전달되는 값은 순서대로 문자열에 연결됩니다.

튜플에 포함된 문자열 값은 다음과 같은 인덱스 번호에 해당합니다:

“happy” “smiling” “blue” “shark”
0 1 2 3

값의 색인 번호를 사용하여 문자열에 나타나는 순서를 변경합시다:

print("Sammy is a {3}, {2}, and {1} {0}!".format("happy", "smiling", "blue", "shark"))
Output
Sammy is a shark, blue, and smiling happy!

3번 인덱스 번호로 시작했으므로, 우리는 처음에 "shark"의 마지막 값을 호출했습니다. 매개변수로 포함된 다른 색인 번호는 원래 문자열 내에서 단어가 나타나는 순서를 변경합니다.

위치 인수 외에도 키워드 인수를 소개할 수도 있습니다. 이들은 키워드 이름으로 호출됩니다:

print("Sammy the {0} {1} a {pr}.".format("shark", "made", pr = "pull request"))
Output
Sammy the shark made a pull request.

이 예제는 위치 인수와 함께 사용되는 키워드 인수의 사용을 보여줍니다. 위치 인수와 함께 키워드 인수 pr을 채워 넣을 수 있으며, 이러한 인수를 이동하여 결과 문자열을 변경할 수 있습니다:

print("Sammy the {pr} {1} a {0}.".format("shark", "made", pr = "pull request"))
Output
Sammy the pull request made a shark.

문자열 서식 지정기와 함께 사용되는 위치 및 키워드 인수를 사용하면 원래 문자열을 재배열하여 조작할 수 있는 더 많은 제어를 제공합니다.

##유형 지정

우리는 구문의 중괄호 안에 더 많은 매개변수를 포함할 수 있습니다. 우리는 형식 코드 구문 {field_name:conversion}을 사용할 것입니다. 여기서 field_name다시 정렬 섹션에서 다룬 str.format() 메서드에 대한 인수의 색인 번호를 지정하고, conversion은 형식 지정기와 사용하는 데이터 유형의 변환 코드를 나타냅니다.

변환 유형은 Python에서 사용하는 단일 문자형 코드를 나타냅니다. 여기에서 사용할 코드는 문자열에 대한 s, 10 진 정수(10진수)를 표시하는 d, 그리고 소수점 이하 자리를 포함하여 부동 소수점 수를 표시하는 f입니다. Python 3의 공식 문서에서 형식 지정 미니 언어에 대해 자세히 알아볼 수 있습니다.

정수가 메서드를 통해 전달되지만 f 변환 유형 인수를 추가하여 부동 소수점으로 표시하려는 예제를 살펴 보겠습니다:

print("Sammy ate {0:f} percent of a {1}!".format(75, "pizza"))
Output
Sammy ate 75.000000 percent of a pizza!

우리는 첫 번째 중괄호 치환 필드에 부동 소수점을 출력하기 위해 {field_name:conversion} 구문을 사용했습니다. 두 번째 중괄호는 오직 첫 번째 매개변수 {field_name}만 사용합니다.

위 예제에서 소수점 이하에 많은 숫자가 표시되지만 그것들을 제한할 수 있습니다. 부동 소수점 값을 지정할 때 f를 지정하면 소수점 이하의 숫자를 포함할 원하는 숫자 다음에 온점 .을 포함하여 그 값을 정밀하게 지정할 수 있습니다.

Sammy가 피자의 75.765367%를 먹었지만 우리는 높은 정확도가 필요하지 않은 경우 소수점 이하 자리를 3으로 제한하여 .3을 변환 유형 f 앞에 추가할 수 있습니다:

print("Sammy ate {0:.3f} percent of a pizza!".format(75.765367))
Output
Sammy ate 75.765 percent of a pizza!

소수점 이하 한 자리만 원하는 경우 문자열과 메서드를 다음과 같이 다시 작성할 수 있습니다:

print("Sammy ate {0:.1f} percent of a pizza!".format(75.765367))
Output
Sammy ate 75.8 percent of a pizza!

정밀도를 수정하면 숫자가 반올림되는 것에 유의하십시오.

비록 소수 자리 없는 숫자를 부동 소수점으로 표시하지만, 부동 소수점을 정수로 변경하려고 시도하면 d 변환 유형을 사용하여 오류가 발생합니다:

print("Sammy ate {0:d} percent of a pizza!".format(75.765367))
Output
ValueError: Unknown format code 'd' for object of type 'float'

소수점 이후에 표시되는 자릿수를 제한하는 방법은 다음과 같이 포매터를 작성하면 됩니다:

print("Sammy ate {0:.0f} percent of a pizza!".format(75.765367))
Output
Sammy ate 76 percent of a pizza!

이렇게 하면 부동 소수점을 정수로 변환하지 않고 소수점 이후에 표시되는 자릿수를 제한합니다.

##패딩 변수 치환

플레이스홀더는 치환 필드이기 때문에 추가 매개변수를 사용하여 요소 주위에 여백을 생성하거나 만들 수 있습니다. 많은 양의 데이터를 시각적으로 구성해야 할 때 유용합니다.

구문의 중괄호 안에 콜론 : 뒤에 문자 수(문자 단위)를 나타내는 숫자를 추가할 수 있습니다:

print("Sammy has {0:4} red {1:16}!".format(5, "balloons"))
Output
Sammy has 5 red balloons !

위의 예에서 숫자 5에는 4개의 문자 필드 크기를, 문자열 balloons에는 16개의 문자 필드 크기를 지정했습니다 (그것은 긴 문자열이기 때문에).

기본적으로 문자열은 필드 내에서 좌측 정렬되고, 숫자는 우측 정렬됩니다. 이것을 수정하려면 콜론 뒤에 정렬 코드를 배치하면 됩니다. <는 필드 내의 텍스트를 왼쪽 정렬하고, ^는 텍스트를 필드 내에서 가운데 정렬하며, >는 텍스트를 우측 정렬합니다.

숫자는 좌측 정렬하고 문자열은 가운데 정렬합시다:

print("Sammy has {0:<4} red {1:^16}!".format(5, "balloons"))
Output
Sammy has 5 red balloons !

이제 5가 왼쪽 정렬되어 있으며 red 앞에 필드에 공백이 제공되고 balloons은 필드 내에서 가운데 정렬되어 있으며 양쪽에 공백이 있습니다.

기본적으로 포매터로 필드를 더 크게 만들 때 Python은 해당 필드를 공백 문자로 채웁니다. 우리는 바로 콜론 다음에 원하는 문자를 지정함으로써 그것을 다른 문자로 수정할 수 있습니다:

print("{:*^20s}".format("Sammy"))
Output
*******Sammy********

우리는 포맷 함수에 전달되는 문자열을 0번째 인덱스 위치에 받아들이고, 우리가 그렇게 명시하지 않았기 때문에, 콜론을 포함하고, 공백 대신에 *를 사용할 것이라고 지정하며, 이 문자열을 가운데 정렬하고 20자 크기의 필드임을 지정하고 또한 s를 포함하여 문자열 변환 유형을 사용한다고 나타냅니다.

우리는 이러한 매개변수를 이전에 사용한 다른 매개변수와 결합할 수 있습니다:

print("Sammy ate {0:5.0f} percent of a pizza!".format(75.765367))
Output
Sammy ate 76 percent of a pizza!

중괄호 안의 매개변수에서 우리는 부동 소수점의 인덱스 필드 번호를 지정하고 콜론을 포함하고, 필드 숫자의 크기를 나타내고, 소수점 이하의 숫자를 작성한 다음 f 변환 유형을 지정했습니다.

##변수 사용

지금까지 우리는 str.format() 메서드에 정수, 부동 소수점 및 문자열을 전달했지만 메서드를 통해 변수도 전달할 수 있습니다. 이는 다른 변수와 마찬가지로 작동합니다.

nBalloons = 8
print("Sammy has {} balloons today!".format(nBalloons))
Output
Sammy has 8 balloons today!

원래 문자열과 메서드를 통해 전달되는 내용에 변수를 사용할 수 있습니다:

sammy = "Sammy has {} balloons today!"
nBalloons = 8
print(sammy.format(nBalloons))
Output
Sammy has 8 balloons today!

변수는 서식 지정자 구문 구성의 각 부분에 대해 쉽게 대체될 수 있습니다. 이렇게하면 사용자 생성 입력을 가져와 해당 값을 변수에 할당할 때 작업이 더 쉬워집니다.

데이터 구성을 위해 서식 지정자 사용

서식 지정자는 많은 데이터를 시각적으로 구성할 때 가장 잘 사용될 때 볼 수 있습니다. 데이터베이스를 사용자에게 보여줄 때, 필드 크기를 늘리고 정렬을 수정하여 출력을 더 읽기 쉽게 만들 수 있습니다.

파이썬의 전형적인 for 루프를 살펴 보겠습니다. 여기서 3에서 12까지의 범위에서 i, i*i, 그리고 i*i*i를 출력합니다:

for i in range(3,13):
    print(i, i*i, i*i*i)
Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

출력은 어느 정도 구성되어 있지만, 숫자가 서로의 열로 넘치면서 출력의 하단이 덜 읽기 쉬워집니다. 많은 작고 큰 숫자로 이루어진 더 큰 데이터 세트를 처리하는 경우, 이는 문제가 될 수 있습니다.

이러한 숫자에 더 많은 공간을 제공하기 위해 서식 지정자를 사용해 보겠습니다:

for i in range(3,13):
    print("{:3d} {:4d} {:5d}".format(i, i*i, i*i*i))

여기서 중괄호 안에 인덱스 번호를 추가하지 않고 콜론으로 시작하여 필드 크기를 나타내는 숫자와, 정수와 함께 d 변환 유형을 추가하지 않았습니다. 이 예에서는 예상되는 각 출력의 크기에 대해 2개의 추가 문자 공간을 제공하여 출력을 다음과 같이 만들었습니다:

Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

더 큰 숫자를 고려하여 각각의 일정한 필드 크기 번호를 지정할 수 있습니다. 이렇게하면 열이 균일해져 더 큰 숫자를 고려할 수 있습니다:

for i in range(3,13):
    print("{:6d} {:6d} {:6d}".format(i, i*i, i*i*i))
Output
3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 11 121 1331 12 144 1728

열의 정렬을 다룰 때 <, ^, >을 추가하여 텍스트 정렬을 조작할 수도 있습니다. 소수 자릿수를 추가하려면 df로 변경하고 필드 이름 인덱스 번호를 변경하여 데이터를 원하는대로 표시합니다.

##결론

변수 치환을 위한 포매터 사용은 문자열을 연결하고 값 및 데이터를 구성하는 효과적인 방법일 수 있습니다. 포매터는 변수 치환을 문자열에 전달하는 기본적이지만 비기술적인 방법을 나타내며, 출력이 읽기 쉽고 사용자 친화적인지 확인하는 데 유용합니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-string-formatters-in-python-3