소개
이 섹션은 약간의 여담이지만, 데이터를 다룰 때 종종 구조화된 출력 (표 등) 을 생성하고 싶을 것입니다. 예를 들어 다음과 같습니다.
Name Shares Price
---------- ---------- -----------
AA 100 32.20
IBM 50 91.10
CAT 150 83.44
MSFT 200 51.23
GE 95 40.37
MSFT 50 65.10
IBM 100 70.44
문자열 서식 지정 (String Formatting)
Python 3.6 이상에서 문자열 서식을 지정하는 한 가지 방법은 f-string을 사용하는 것입니다.
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{name:>10s} {shares:>10d} {price:>10.2f}'
' IBM 100 91.10'
>>>
{expression:format} 부분이 대체됩니다.
이는 print와 함께 일반적으로 사용됩니다.
print(f'{name:>10s} {shares:>10d} {price:>10.2f}')
서식 코드 (Format codes)
서식 코드 ( {} 안의 : 뒤) 는 C 의 printf()와 유사합니다. 일반적인 코드는 다음과 같습니다.
d Decimal integer
b Binary integer
x Hexadecimal integer
f Float as [-]m.dddddd
e Float as [-]m.dddddde+-xx
g Float, but selective use of E notation
s String
c Character (from integer)
일반적인 수정자는 필드 너비와 소수점 정밀도를 조정합니다. 다음은 부분 목록입니다.
:>10d Integer right aligned in 10-character field
:<10d Integer left aligned in 10-character field
:^10d Integer centered in 10-character field
:0.2f Float with 2 digit precision
딕셔너리 서식 지정 (Dictionary Formatting)
format_map() 메서드를 사용하여 값의 딕셔너리에 문자열 서식을 적용할 수 있습니다.
>>> s = {
'name': 'IBM',
'shares': 100,
'price': 91.1
}
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format_map(s)
' IBM 100 91.10'
>>>
f-string과 동일한 코드를 사용하지만, 제공된 딕셔너리에서 값을 가져옵니다.
format() 메서드
인수 또는 키워드 인수에 서식을 적용할 수 있는 format() 메서드가 있습니다.
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format(name='IBM', shares=100, price=91.1)
' IBM 100 91.10'
>>> '{:>10s} {:10d} {:10.2f}'.format('IBM', 100, 91.1)
' IBM 100 91.10'
>>>
솔직히 말해서, format()은 약간 장황합니다. 저는 f-string 을 선호합니다.
C 스타일 서식 지정 (C-Style Formatting)
서식 지정 연산자 %를 사용할 수도 있습니다.
>>> 'The value is %d' % 3
'The value is 3'
>>> '%5d %-5d %10d' % (3,4,5)
' 3 4 5'
>>> '%0.2f' % (3.1415926,)
'3.14'
이 방식은 오른쪽에 단일 항목 또는 튜플을 필요로 합니다. 서식 코드 또한 C 의 printf()를 모델로 합니다.
참고: 바이트 문자열에서 사용 가능한 유일한 서식 지정 방식입니다.
>>> b'%s has %d messages' % (b'Dave', 37)
b'Dave has 37 messages'
>>> b'%b has %d messages' % (b'Dave', 37) ## %b may be used instead of %s
b'Dave has 37 messages'
>>>
연습 문제 2.8: 숫자를 서식 지정하는 방법
숫자를 출력할 때 흔히 발생하는 문제는 소수점 자릿수를 지정하는 것입니다. 이를 해결하는 한 가지 방법은 f-string 을 사용하는 것입니다. 다음 예제를 시도해 보세요.
>>> value = 42863.1
>>> print(value)
42863.1
>>> print(f'{value:0.4f}')
42863.1000
>>> print(f'{value:>16.2f}')
42863.10
>>> print(f'{value:<16.2f}')
42863.10
>>> print(f'{value:*>16,.2f}')
*******42,863.10
>>>
f-string 에서 사용되는 서식 코드에 대한 전체 문서는 여기에서 찾을 수 있습니다. 서식 지정은 문자열의 % 연산자를 사용하여 수행되기도 합니다.
>>> print('%0.4f' % value)
42863.1000
>>> print('%16.2f' % value)
42863.10
>>>
%와 함께 사용되는 다양한 코드에 대한 문서는 여기에서 찾을 수 있습니다.
print와 함께 자주 사용되지만, 문자열 서식 지정은 출력에만 국한되지 않습니다. 서식이 지정된 문자열을 저장하려면 변수에 할당하기만 하면 됩니다.
>>> f = '%0.4f' % value
>>> f
'42863.1000'
>>>
연습 문제 2.9: 데이터 수집
연습 문제 2.7 에서 주식 포트폴리오의 손익을 계산하는 report.py라는 프로그램을 작성했습니다. 이 연습 문제에서는 다음과 같은 표를 생성하도록 해당 프로그램을 수정하기 시작합니다.
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
이 보고서에서 "Price"는 주식의 현재 주가를 의미하고 "Change"는 초기 구매 가격에서 주가 변동을 의미합니다.
위 보고서를 생성하려면 먼저 표에 표시된 모든 데이터를 수집해야 합니다. 주식 목록과 가격 딕셔너리를 입력으로 받아 위 표의 행을 포함하는 튜플 목록을 반환하는 함수 make_report()를 작성하십시오.
이 함수를 report.py 파일에 추가하십시오. 대화형으로 시도하면 다음과 같이 작동합니다.
>>> portfolio = read_portfolio('/home/labex/project/portfolio.csv')
>>> prices = read_prices('/home/labex/project/prices.csv')
>>> report = make_report(portfolio, prices)
>>> for r in report:
print(r)
('AA', 100, 9.22, -22.980000000000004)
('IBM', 50, 106.28, 15.180000000000007)
('CAT', 150, 35.46, -47.98)
('MSFT', 200, 20.89, -30.339999999999996)
('GE', 95, 13.48, -26.889999999999997)
...
>>>
연습 문제 2.10: 서식 지정된 표 출력
연습 문제 2.9 의 for-loop 를 다시 수행하되, print 문을 변경하여 튜플의 서식을 지정합니다.
>>> for r in report:
print('%10s %10d %10.2f %10.2f' % r)
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
값을 확장하고 f-string 을 사용할 수도 있습니다. 예를 들어:
>>> for name, shares, price, change in report:
print(f'{name:>10s} {shares:>10d} {price:>10.2f} {change:>10.2f}')
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
...
>>>
위의 문을 가져와 report.py 프로그램에 추가하십시오. 프로그램이 make_report() 함수의 출력을 받아 표시된 것처럼 깔끔하게 서식이 지정된 표를 출력하도록 하십시오.
연습 문제 2.11: 헤더 추가
다음과 같은 헤더 이름 튜플이 있다고 가정해 보겠습니다.
headers = ('Name', 'Shares', 'Price', 'Change')
위의 헤더 튜플을 사용하여 각 헤더 이름이 10 자 너비 필드에서 오른쪽 정렬되고 각 필드가 단일 공백으로 구분된 문자열을 생성하는 코드를 프로그램에 추가하십시오.
' Name Shares Price Change'
헤더를 가져와 헤더와 뒤따르는 데이터 사이의 구분 문자열을 생성하는 코드를 작성하십시오. 이 문자열은 각 필드 이름 아래에 있는 일련의 "-" 문자입니다. 예를 들어:
'---------- ---------- ---------- -----------'
작업이 완료되면 프로그램은 이 연습의 맨 위에 표시된 표를 생성해야 합니다.
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84
연습 문제 2.12: 서식 지정 챌린지
가격에 통화 기호 ($) 가 포함되도록 코드를 수정하고 출력이 다음과 같이 보이도록 하려면 어떻게 해야 할까요?
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 $9.22 -22.98
IBM 50 $106.28 15.18
CAT 150 $35.46 -47.98
MSFT 200 $20.89 -30.34
GE 95 $13.48 -26.89
MSFT 50 $20.89 -44.21
IBM 100 $106.28 35.84
요약
축하합니다! 서식 지정 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.