textwrap — 텍스트 줄 바꿈과 채우기
textwrap — 텍스트 줄 바꿈과 채우기
textwrap 모듈은 몇 가지 편의 함수와, 실제로 모든 작업을 수행하는 클래스인 TextWrapper를 제공해요. 텍스트 문자열 한두 개만 줄 바꿈하거나 채우려면 편의 함수로 충분해요. 하지만 그렇지 않은 경우에는 효율을 위해 TextWrapper 인스턴스를 사용하는 편이 좋아요.
본문
textwrap.wrap(text, width=70, *, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder='[...]')
text(문자열)에 들어 있는 단일 문단을 줄 바꿔서, 각 줄이 최대 width자 길이가 되게 해요. 마지막 개행 문자 없이 출력 줄 목록을 반환해요.
선택적인 키워드 인자는 아래에 문서화된 TextWrapper의 인스턴스 속성에 대응해요. wrap()이 어떻게 동작하는지에 대한 자세한 내용은 TextWrapper.wrap() 메서드를 참고해요.
textwrap.fill(text, width=70, *, ...)
text의 단일 문단을 줄 바꾸고, 줄 바꿈된 문단을 담은 단일 문자열을 반환해요. fill()은 "\n".join(wrap(text, ...))의 줄임 표현이에요. 특히 fill()은 wrap()과 정확히 같은 키워드 인자를 받아요.
textwrap.shorten(text, width, *, fix_sentence_endings=False, break_long_words=True, break_on_hyphens=True, placeholder='[...]')
주어진 텍스트를 축약하고 잘라내서 주어진 width에 맞춰요.
먼저 text의 공백을 접습니다(모든 공백을 단일 공백으로 바꿔요). 결과가 width에 맞으면 그대로 반환해요. 그렇지 않으면 나머지 단어와 placeholder가 width 안에 들어갈 때까지 끝에서 단어를 충분히 제거해요.
>>> textwrap.shorten("Hello world!", width=12)
'Hello world!'
>>> textwrap.shorten("Hello world!", width=11)
'Hello [...]'
>>> textwrap.shorten("Hello world", width=10, placeholder="...")
'Hello...'
선택적 키워드 인자는 아래에 문서화된 TextWrapper 인스턴스 속성에 대응해요. 공백은 TextWrapper의 fill() 함수에 텍스트가 전달되기 전에 접히므로, tabsize, expand_tabs, drop_whitespace, replace_whitespace의 값을 바꿔도 효과가 없다는 점에 주의하세요.
버전 3.4에서 추가되었어요.
textwrap.dedent(text)
text의 모든 줄에서 공통으로 나타나는 선행 공백을 제거해요.
이 기능은 삼중 따옴표 문자열을 소스 코드에서는 들여쓴 형태로 보여주면서도, 표시할 때는 왼쪽 가장자리에 맞춰 정렬하는 데 사용할 수 있어요.
탭과 공백은 모두 공백으로 취급되지만 서로 같지는 않아요. 즉 "hello"와 "\thello"는 공통 선행 공백이 없는 것으로 간주돼요.
공백만으로 이루어진 줄은 입력에서는 무시되고 출력에서는 단일 개행 문자로 정규화돼요. 예를 들어:
def test():
# 끝 줄을 \로 끝내서 빈 줄을 피해요!
s = '''\
hello
world
'''
print(repr(s)) # ' hello\n world\n '
print(repr(dedent(s))) # 'hello\n world\n'
버전 3.14에서 변경: dedent() 함수는 이제 공백 문자만 포함한 빈 줄도 올바르게 정규화해요. 이전에는 탭과 공백만 포함한 빈 줄만 정규화했어요.
textwrap.indent(text, prefix, predicate=None)
text에서 선택된 줄의 시작 부분에 prefix를 추가해요.
줄 구분은 text.splitlines(True)를 호출해서 구분해요. 기본적으로 prefix는 공백만으로 이루어지지 않은 모든 줄(줄 끝 포함)에 추가돼요. 예를 들어:
>>> s = 'hello\n\n \nworld'
>>> indent(s, ' ')
' hello\n\n \n world'
선택적 predicate 인자를 사용하면 어떤 줄을 들여쓸지 제어할 수 있어요. 예를 들어 빈 줄과 공백만 있는 줄에도 prefix를 쉽게 추가할 수 있어요:
>>> print(indent(s, '+ ', lambda line: True))
+ hello
+
+
+ world
버전 3.3에서 추가되었어요.
classtextwrap.TextWrapper(**kwargs)
wrap(), fill(), shorten()은 내부적으로 TextWrapper 인스턴스를 만들고 그 위에서 단일 메서드를 호출하는 방식으로 동작해요. 그 인스턴스는 재사용되지 않으므로, wrap()이나 fill()로 많은 텍스트 문자열을 처리하는 애플리케이션이라면 직접 TextWrapper 객체를 만들어 사용하는 편이 더 효율적일 수 있어요.
텍스트는 가능하면 공백과 하이픈으로 연결된 단어의 하이픈 바로 뒤에서 줄 바꿈이 이루어져요. 그런 다음에야 긴 단어를 깨뜨리는데, TextWrapper.break_long_words가 false로 설정되지 않은 경우에 한해요.
TextWrapper 생성자는 여러 선택적 키워드 인자를 받아요. 각 키워드 인자는 인스턴스 속성에 대응하므로, 예를 들어 wrapper = TextWrapper(initial_indent="* ")는 wrapper = TextWrapper() 후 wrapper.initial_indent = "* "와 같아요.
같은 TextWrapper 객체를 여러 번 재사용할 수 있고, 사용 사이에 인스턴스 속성에 직접 할당해 어떤 옵션이든 바꿀 수 있어요.
주요 인스턴스 속성은 다음과 같아요:
width(기본값: 70) — 줄 바꿈된 줄의 최대 길이expand_tabs(기본값: True) — 텍스트의 모든 탭 문자를 공백으로 확장tabsize(기본값: 8) — 탭을 확장할 때 사용할 탭 크기replace_whitespace(기본값: True) — 각 공백 문자를 단일 공백으로 대체drop_whitespace(기본값: True) — 각 줄의 시작과 끝 공백 제거initial_indent(기본값: '') — 출력 첫 줄 앞에 붙는 문자열subsequent_indent(기본값: '') — 첫 줄을 제외한 모든 줄 앞에 붙는 문자열fix_sentence_endings(기본값: False) — 문장 끝을 감지해 문장 사이를 정확히 두 칸으로 분리break_long_words(기본값: True) —width보다 긴 단어를 잘라 깨뜨림break_on_hyphens(기본값: True) — 복합어의 하이픈 뒤에서 줄 바꿈 허용max_lines(기본값: None) — None이 아니면 출력은 최대max_lines줄, 끝에 placeholder 표시placeholder(기본값: '[...]') — 잘렸을 때 출력 텍스트 끝에 나타나는 문자열
TextWrapper는 모듈 수준 편의 함수에 대응하는 공개 메서드도 제공해요:
wrap(text)— 단일 문단을 줄 바꿔 최대width자 길이의 줄 목록(마지막 개행 없이)을 반환fill(text)— 단일 문단을 줄 바꾸고 줄 바꿈된 문단을 담은 단일 문자열을 반환