
Python 문자열 포맷팅 기본 개념
Python에서 문자열 포맷팅은 문자열 내의 플레이스홀더에 변수나 값을 삽입하여 동적인 문자열을 생성하는 기법이다. Python은 문자열과 숫자를 직접 결합할 수 없으므로, 포맷팅은 데이터 출력, 메시지 생성, 보고서 작성에서 필수적인 기능이다.
Python은 문자열 포맷팅을 위한 여러 방법을 제공하며, 각각은 고유한 장점과 사용 사례를 가지고 있다. format() 메서드는 강력하고 유연한 포맷팅 기능을 제공하며, 다양한 서식 지정자를 통해 출력 형식을 세밀하게 제어할 수 있다.
format() 메서드 기본 사용법
format() 메서드는 문자열 내의 중괄호 {}를 플레이스홀더로 사용하여 변수를 삽입한다. 이 방식은 템플릿과 데이터를 분리하여 코드의 가독성과 재사용성을 높인다.
단일 값 삽입
price = 49
txt = "The price is {} dollars"
print(txt.format(price))
위 코드는 “The price is 49 dollars”를 출력한다. 중괄호 위치에 format() 메서드의 인수가 삽입된다.
다중 플레이스홀더 활용
여러 개의 플레이스홀더를 사용하여 복수의 값을 한 번에 삽입할 수 있다. 플레이스홀더는 format() 메서드의 인수 순서대로 채워진다.
quantity = 3
itemno = 567
price = 49.95
myorder = "I want {} pieces of item {} for {} dollars."
print(myorder.format(quantity, itemno, price))
위 코드는 “I want 3 pieces of item 567 for 49.95 dollars.”를 출력한다.
인덱스를 이용한 순서 제어
플레이스홀더 내부에 인덱스 번호를 지정하여 변수의 삽입 순서를 제어할 수 있다. 이는 동일한 값을 여러 위치에서 사용하거나 순서를 변경할 때 유용하다.
quantity = 3
itemno = 567
price = 49.95
myorder = "I want to pay {2} dollars for {0} pieces of item {1}."
print(myorder.format(quantity, itemno, price))
위 코드는 “I want to pay 49.95 dollars for 3 pieces of item 567.”을 출력한다. 인덱스 0은 첫 번째 인수(quantity), 인덱스 1은 두 번째 인수(itemno), 인덱스 2는 세 번째 인수(price)를 참조한다.
동일 값 재사용
같은 인덱스를 여러 번 사용하여 하나의 값을 문자열의 여러 위치에 삽입할 수 있다.
name = "John"
age = 36
txt = "His name is {0}. {0} is {1} years old."
print(txt.format(name, age))
위 코드는 “His name is John. John is 36 years old.”를 출력한다.
명명된 인덱스 활용
숫자 대신 의미있는 이름을 사용하여 플레이스홀더를 지정할 수 있다. 이 방식은 복잡한 템플릿에서 가독성을 크게 향상시킨다.
myorder = "I have a {carname}, it is a {model}."
print(myorder.format(carname="Ford", model="Mustang"))
위 코드는 “I have a Ford, it is a Mustang.”을 출력한다.
포맷 지정자를 이용한 고급 포맷팅
플레이스홀더 내부에 콜론(:)을 사용하여 값의 출력 형식을 세밀하게 제어할 수 있다. 이는 숫자의 소수점 자릿수, 정렬, 패딩 등을 설정할 때 사용된다.
소수점 자릿수 제어
price = 49
txt = "The price is {:.2f} dollars"
print(txt.format(price))
위 코드는 “The price is 49.00 dollars”를 출력한다. .2f는 소수점 둘째 자리까지 표시하는 부동소수점 형식을 의미한다.
천 단위 구분자
salary = 1234567
txt = "Annual salary: ${:,}"
print(txt.format(salary))
위 코드는 “Annual salary: $1,234,567″을 출력한다. 쉼표는 천 단위 구분자를 추가한다.
퍼센트 형식
ratio = 0.256
txt = "Success rate: {:.2%}"
print(txt.format(ratio))
위 코드는 “Success rate: 25.60%”를 출력한다. %는 값에 100을 곱하고 퍼센트 기호를 추가한다.
지수 표기법
num = 1234
txt = "Scientific notation: {:.3e}"
print(txt.format(num))
위 코드는 “Scientific notation: 1.234e+03″을 출력한다.
문자열 정렬과 패딩
포맷 지정자를 사용하여 문자열의 정렬과 패딩을 제어할 수 있다. 이는 테이블 형태의 출력이나 정렬된 텍스트를 생성할 때 유용하다.
기본 정렬 옵션
text = "Hi"
print("{:<10}".format(text))
print("{:>10}".format(text))
print("{:^10}".format(text))
위 코드는 각각 왼쪽 정렬, 오른쪽 정렬, 가운데 정렬된 결과를 출력한다.
채움 문자 지정
text = "Hi"
print("{:*^10}".format(text))
위 코드는 “****Hi****”를 출력한다. 별표(*)로 빈 공간을 채운다.
부호 표시 제어
숫자의 부호 표시를 세밀하게 제어할 수 있다.
positive = 7
negative = -7
print("{:+d}".format(positive))
print("{:+d}".format(negative))
print("{: d}".format(positive))
print("{: d}".format(negative))
위 코드는 “+7”, “-7″, ” 7″, “-7″을 각각 출력한다.
진법 변환
정수를 다양한 진법으로 표현할 수 있다.
n = 255
print("Binary: {:b}".format(n))
print("Octal: {:o}".format(n))
print("Decimal: {:d}".format(n))
print("Hex (lowercase): {:x}".format(n))
print("Hex (uppercase): {:X}".format(n))
위 코드는 이진법(11111111), 팔진법(377), 십진법(255), 십육진법(ff, FF)으로 변환된 결과를 출력한다.
포맷 지정자 종합 표
분류 | 서식 | 설명 | 예시 | 결과 |
---|---|---|---|---|
소수점 | {:.2f} | 소수 둘째 자리까지 표시 | “{:.2f}”.format(3.14159) | 3.14 |
천 단위 | {:,} | 천 단위 구분자 표시 | “{:,}”.format(1234567) | 1,234,567 |
퍼센트 | {:.1%} | 백분율로 표시 | “{:.1%}”.format(0.238) | 23.8% |
정렬 | {:<10}, {:>10}, {:^10} | 좌, 우, 가운데 정렬 | “{:^10}”.format(“Hi”) | Hi |
채움 | {:*^10} | 지정 문자로 채움 | “{:*^10}”.format(“Hi”) | ****Hi**** |
부호 | {:+d}, {:-d}, {: d} | 양수 기호, 기본, 공백 | “{:+d}”.format(7) | +7 |
진법 | {:b}, {:o}, {:x}, {:X} | 이진, 팔진, 십육진 | “{:x}”.format(255) | ff |
지수 | {:.2e}, {:.2E} | 지수 표기법 | “{:.2e}”.format(1234) | 1.23e+03 |
실무 활용 예제
실제 프로그래밍에서 자주 사용되는 복합적인 포맷팅 패턴을 살펴보자.
students = [
{"name": "Alice", "score": 95.5, "grade": "A"},
{"name": "Bob", "score": 87.2, "grade": "B"},
{"name": "Charlie", "score": 92.8, "grade": "A"}
]
header = "{:<10} {:>8} {:>6}".format("Name", "Score", "Grade")
separator = "-" * len(header)
print(header)
print(separator)
for student in students:
row = "{:<10} {:>8.1f} {:>6}".format(
student["name"],
student["score"],
student["grade"]
)
print(row)
위 코드는 정렬된 학생 성적표를 생성한다.
format() 메서드와 f-strings 비교
구분 | format() 메서드 | f-strings |
---|---|---|
Python 버전 | 2.6 이상 | 3.6 이상 |
문법 | “…”.format(var) | f”…” |
가독성 | 중괄호 위치와 인자 매핑 필요 | 변수를 직접 삽입하여 직관적 |
성능 | 우수 | 가장 우수 |
템플릿 재사용 | 용이함 | 제한적 |
복잡한 포맷팅 | 모든 서식 지정자 지원 | 동일한 서식 지정자 지원 |
💡 문자열 포맷팅 모범 사례:
• 현대적인 코드에서는 f-strings를 우선 고려한다
• 템플릿 재사용이 필요한 경우 format() 메서드를 활용한다
• 명명된 인덱스를 사용하여 코드 가독성을 높인다
• 숫자 출력 시 적절한 포맷 지정자를 활용한다
• 테이블 형태 출력에서는 정렬과 패딩을 적극 활용한다
• 복잡한 서식이 필요한 경우 format() 메서드의 고급 기능을 활용한다
Python의 문자열 포맷팅 기능은 동적 텍스트 생성의 핵심 도구다. format() 메서드의 다양한 서식 지정자와 옵션을 활용하면 전문적이고 가독성 높은 출력을 효율적으로 생성할 수 있다.