Post

[Python] 정밀한 텍스트 포맷팅

파이썬 스킬 업을 보고 정리한 내용입니다.

백분율 기호 연산자(%)를 사용한 포매팅

  • 다음과 같이 2가지로 사용
    • 포맷_문자열 % 값
      • print('n is %d' % n)
    • 포맷_문자열 % (여러_값들)
      • print('n is %d and m is %d' % (n,m))

포맷 지시자

  • 각종 포맷들을 다음과 같이 지정
    • %d : 10진수
    • %i : 정수
    • %s : 입력 값의 표준 문자열 표현
    • %r : %s와 동일할 때가 많지만 객체가 파이썬 코드에게 보이는 그대로 출력함 ('Bob')
    • %x : 16진수 (%X 도 동일하지만 A-F를 대문자로)
    • %o : 8진수
    • %u : 무부호 정수
    • %f : 고정소수점 포맷으로 출력하는 부동소수점 숫자 (%F 도 동일)
    • %e : 지수 기호(e)를 출력하는 부동소수점 숫자
    • %g: 가장 짧은 기준 표현(canonical representation)을 사용한 부동소수점
    • %% : 리터럴 백분율 기호

너비와 정밀도 표현

  • 다음 포맷 모두 허용
    • %c
    • %너비c
    • %너비.정밀도c
    • %.정밀도c
    • 기본적으로 너비보다 길이가 짧으면 왼쪽 자리맞춤을 하지만 %-너비c 이렇게 마이너스가 붙으면 오른쪽 자리맞춤을 함
    • 정밀도는 빈칸을 0으로 채우는데 정수의 경우 25의 정밀도를 5로 지정하면 00025 이런 식으로, 3.14의 정밀도를 5로 지정하면 3.14000 이런 식으로 부동소수점 숫자 표현에 사용
      • 정밀도 설정이 소수점 길이보다 짧게 되면 상황에 따라 반올림/버림을 함

변수-너비 출력 필드

  • 고정 너비로 출력하고 싶을 때 그걸 어떻게 변수로 입력할까?
    • 별표 기호를 붙인다 + 추가 인수를 튜플 맨 앞에 집어넣는다.
      • 'Here is a number: %*d' % (3,6)
        • 여기서 3이 내가 원하는 넓이
      • 'Here is a number: 6'
    • 별표 기호는 여러개 사용할 수 있다. 그러면 추가 인수도 순서대로 여러개 넣어줘야 함.
      • 'Item 1: %*s, Item 2: %*s' % (8, 'Bob', 8, Suzanne')
    • 사실 이건 별표가 저 위 너비와 정밀도 표현의 너비 값을 대체하기 때문임
    • 마찬가지로 정밀도 표현도 할 수 있는데 다음 코드는 %8.3f인 것과 동일함
      • '%*.*f' % (8, 3, 3.141592)

format 메서드

전역 format 함수

  • 문자열 클래스의 format 메서드는 문자열을 처리할 때 입력받은 데이터 객체와 함께 포맷 지시자를 분석하며 각각의 개별적 필드는 전역 format 함수를 호출하여 분석을 수행
    • format 함수는 데이터 객체 클래스의 __format__ 메서드를 호출함
  • format(데이터, 사양)
    • 데이터를 확보하여 사양에 맞는 포맷을 적용한 문자열을 반환함
    • 사양 문법: [너비][,][.정밀도][타입_문자]
      • [너비] 특정 길이의 출력 필드에 데이터를 문자로 표현
      • [,] 숫자인 경우 천 단위 위치 구분자로 쉼표 기호를 넣을지
      • [정밀도] 는 정수와 사용할 수 없고 f인 경우 소수점 오른쪽에 출력할 숫자의 고정된 자리수, 숫자가 아닌 경우 문자열 데이터의 최대 길이를 의미함

format 메서드 소개

  • format 함수의 모든 기능을 사용하지만 여러 출력 필드를 다룰 수 있어 훨씬 유연함
  • 포맷이 지시된 문자열.format(인수들)
    • 특별한 포맷을 지정하지 않는다면 단순하게 중괄호 기호 쌍을 각 항목에 사용할 수 있음
    • 인수들의 값은 상수일 수도 있고 변수에 의해 제공받을 수 있음

위치로 순서 정하기 (이름 혹은 색인)

  • 정수 상수를 위치 필드에 사용하여 역순으로 인수를 출력할 수 있음
    • 'The items are {2}, {1}, {0}.'.format(10,20,30)
    • 반복도 가능
  • 리스트를 색인으로 사용
1
2
3
a_list = [100,200,300]
print('{0[1]:}, {0[2]:}'.format(a_list))
print('{a[1]:}, {a[2]:}'.format(a=a_list))

repr v.s. 문자열 변환

  • repr 변환: 데이터 객체를 코드에서 표현하는 기준 방식으로 해석
  • test_str = 'Here is a \n newline! '
    • 바로 출력하면 \n에서 개행이 되지만 repr를 적용하면 그대로 (따옴표까지 포함) 출력

format 함수와 메서드의 ‘사양’ 필드

  • 출력-필드 너비
  • 텍스트 조정: 채우기와 자리 맞춤 문자
  • 기호 문자
  • 0으로 시작하는 문자
  • 천 단위 위치 구분자
  • 정밀도 제어
  • 문자열에서 사용한 ‘정밀도(잘라내기)’
  • ‘타입’ 지시자
  • 이진수 출력하기
  • 8진수와 16진수 출력하기
  • 백분율 출력하기
  • 이진수 예시
This post is licensed under CC BY 4.0 by the author.