프로그래밍 언어/python

문자열 포맷팅 (python)

벌게진눈 2019. 8. 11. 00:34
반응형

문자열 포맷팅

"김씨는 24살 입니다."
"이씨는 28살 입니다."
"조씨는 36살 입니다."

위 문장들을 살펴보면 "성"씨는 "나이"살 입니다 와 같은 포맷이 정해져있고
나이에 해당하는 값만 다르게 쓰여집니다.
python에서 위와 같이 사용하는것이 문자열 포맷팅 입니다. 이를 위해 format()을 사용합니다.

중괄호({})를 이용하는 방법

소스코드:

name = ["김", "이", "조"]
age = [24, 28, 36]

for x in range(3):
    print("{}씨는 {}살 입니다.".format(name[x], age[x]))

실행 결과:

김씨는 24살 입니다.
이씨는 28살 입니다.
조씨는 36살 입니다.

format 인자의 순서대로 문자열의 중괄호({}) 안에 변수들이 들어갑니다.
짧은 문자열의 경우 한눈에 알아보기 쉽지만 문자열이 길어진다면 어느 중괄호에 어떤 변수가 들어가는지 식별하기 어렵습니다.

print("{}씨는 {}살 입니다. 가장 좋아하는 음식은 {}이고 가장 싫어하는 음식은 {}입니다.  ".format(name, age, food_like, food_hate))

이를 해결하기 위해 중괄호사이 특정 키워드를 표기하여 가독성을 높일 수 있습니다.

example_string = "{name}씨는 {age}살 입니다. " \
                 "가장 좋아하는 음식은 {food_like}이고 " \
                 "가장 싫어하는 음식은 {food_hate}입니다."
print(example_string.format(name=name, 
                            age=age, 
                            food_like=food_like, 
                            food_hate=food_hate))

printf 스타일 문자열 포매팅(%를 이용하는 방법)

문자열 포맷팅에 % 연산자도 사용될 수 있습니다.

코드 설명
%d 부호 있는 정수 십진 표기.
%i 부호 있는 정수 십진 표기.
%o 부호 있는 8진수 값.
%u 쓸데없는 유형 -- 'd' 와 같습니다.
%x 부호 있는 16진수 (소문자).
%X 부호 있는 16진수 (대문자).
%e 부동 소수점 지수 형식 (소문자).
%E 부동 소수점 지수 형식 (대문자).
%f 부동 소수점 십진수 형식.
%F 부동 소수점 십진수 형식.
%c 단일 문자 (정수 또는 길이 1인 문자열을 허용합니다).
%r 문자열 (repr()을 사용하여 파이썬 객체를 변환합니다).
%s 문자열 (str() 을 사용하여 파이썬 객체를 변환합니다).
%a 문자열 (ascii() 를 사용하여 파이썬 객체를 변환합니다).
%% 인자는 변환되지 않고, 결과에 '%' 문자가 표시됩니다.

소스코드:

print("저의 이름은 %s입니다." % "민수")
print("저는 %d 살 입니다." % 20)
print("저의 이름은 %s 이고 나이는 %d 살 입니다." % ("민수", 20))

실행 결과:

저의 이름은 민수입니다.
저는 20 살 입니다.
저의 이름은 민수 이고 나이는 20 살 입니다.

2개 이상의 변수를 사용하기 위해서는 소괄호를 이용합니다.

공식문서에서는 튜블과 딕셔너리 자료형에서 표시하는것이 올바르지 않기때문에 해당 방법대신 간단하며 유연하고 확장성까지 높은 format()을 이용한 포맷팅 방법이나 문자열 리터럴, string 객체의 Template를 사용하라고 가이드하고 있습니다.

Note

The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer formatted string literals, thestr.format() interface, or template strings may help avoid these errors. Each of these alternatives provides their own trade-offs and benefits of simplicity, flexibility, and/or extensibility.

반응형