7.7. textwrap – Обёртывание и заполнение текста¶textwrap – Text wrapping and filling
Новое в версии 2.3.
Исходный код: Lib/textwrap.py
Модуль textwrap предоставляет две удобные функции, wrap() и
fill(), а также TextWrapper, класс, который выполняет всю работу,
и вспомогательную функцию dedent(). Если нужно обернуть или заполнить одну-две строки, удобных функций должно быть достаточно;
в противном случае для эффективности следует использовать экземпляр TextWrapper.
-
textwrap.wrap(text[, width[, ...]])¶ Переносит один абзац в text (строке) так, чтобы каждая строка была длиной не более width символов. Возвращает список строк результата без завершающих символов новой строки.
Необязательные именованные аргументы соответствуют атрибутам экземпляра
TextWrapper, описанным ниже. width по умолчанию равен70.См. метод
TextWrapper.wrap()для дополнительных сведений о поведенииwrap().
-
textwrap.fill(text[, width[, ...]])¶ Переносит единственный абзац в text и возвращает одну строку, содержащую перенесённый абзац.
fill()– это сокращённая форма записи для"\n".join(wrap(text, ...))
В частности,
fill()принимает те же именованные аргументы, что иwrap().
И wrap(), и fill() работают путём создания экземпляра TextWrapper
и вызова одного метода на нём. Этот экземпляр не используется повторно, поэтому в приложениях,
которые оборачивают/заполняют много строк, эффективнее будет создать
собственный объект TextWrapper.
Текст предпочтительно переносится по пробелам и сразу после дефисов в словах с дефисом; только после этого при необходимости разбиваются длинные слова, если только TextWrapper.break_long_words не установлен в значение false.
Дополнительная вспомогательная функция dedent() предназначена для удаления
отступов из строк, содержащих нежелательные пробелы слева от текста.
-
textwrap.dedent(text)¶ Удаляет общие начальные пробельные символы из каждой строки в text.
Это можно использовать, чтобы выровнять строки с тройными кавычками по левому краю отображения, при этом в исходном коде они остаются с отступами.
Обратите внимание, что табуляция и пробелы считаются пробельными символами, но они не равнозначны: строки
" hello"и"\thello"считаются не имеющими общего начального пробела. (Это поведение новое в Python 2.5; более старые версии этого модуля некорректно разворачивали табуляцию перед поиском общего начального пробела.)Строки, содержащие только пробельные символы, игнорируются во входном тексте и нормализуются до одного символа новой строки в выходном.
Например:
def test(): # завершите первую строку символом \, чтобы избежать пустой строки s = '''\ hello world ''' print repr(s) # выводит ' hello\n world\n ' print repr(dedent(s)) # выводит 'hello\n world\n'
-
class
textwrap.TextWrapper(...)¶ Конструктор
TextWrapperпринимает несколько необязательных именованных аргументов. Каждый аргумент соответствует одному атрибуту экземпляра, так, напримерwrapper = TextWrapper(initial_indent="* ")
это то же самое, что
wrapper = TextWrapper() wrapper.initial_indent = "* "
Один и тот же объект
TextWrapperможно многократно использовать, а любые его параметры можно изменять прямым присваиванием атрибутам экземпляра между использованиями.Атрибуты экземпляра
TextWrapper(и ключевые аргументы конструктора) следующие:-
width¶ (по умолчанию:
70) Максимальная длина перенесённых строк. Если во входном тексте нет отдельных слов длиннееwidth,TextWrapperгарантирует, что ни одна строка вывода не будет длиннееwidthсимволов.
-
expand_tabs¶ (по умолчанию:
True) Если true, все символы табуляции в text будут заменены на пробелы с помощью методаexpandtabs()text.
-
replace_whitespace¶ (по умолчанию:
True) Если true, после замены табуляции, но до переноса строк, методwrap()заменит каждый пробельный символ на один пробел. Заменяемыми пробельными символами являются: табуляция, новая строка, вертикальная табуляция, перевод страницы и возврат каретки ('\t\n\v\f\r').Примечание
Если
expand_tabsравно false, аreplace_whitespace– true, каждый символ табуляции будет заменён одним пробелом, что не то же самое, что и замена табуляции.Примечание
Если
replace_whitespaceравно false, символы новой строки могут появляться в середине строки и приводить к странному выводу. По этой причине текст следует разбивать на абзацы (с помощьюstr.splitlines()или аналогичных средств), которые переносятся отдельно.
-
drop_whitespace¶ (по умолчанию:
True) Если true, пробелы в начале и конце каждой строки (после переноса, но до добавления отступа) удаляются. Однако пробелы в начале абзаца не удаляются, если за ними следует непробельный символ. Если удаляемый пробел занимает всю строку, она удаляется целиком.Новое в версии 2.6: В более ранних версиях пробелы всегда удалялись.
-
initial_indent¶ (по умолчанию:
'') Строка, которая будет добавлена к первой строке перенесённого вывода. Учитывается в длине первой строки. Пустая строка не добавляет отступ.
-
subsequent_indent¶ (по умолчанию:
'') Строка, которая будет добавлена ко всем строкам перенесённого вывода, кроме первой. Учитывается в длине каждой строки, кроме первой.
-
fix_sentence_endings¶ (по умолчанию:
False) Если true,TextWrapperпытается определять концы предложений и гарантирует, что предложения всегда разделяются ровно двумя пробелами. Обычно это желательно для текста в моноширинном шрифте. Однако алгоритм определения концов предложений несовершенен: он предполагает, что конец предложения состоит из строчной буквы, за которой следует один из'.','!'или'?', возможно, за которым следует один из'"'или"'", а затем пробел. Одна из проблем этого алгоритма в том, что он не может обнаружить разницу между «Dr.» в[...] Dr. Frankenstein's monster [...]
и «Spot.» в
[...] See Spot. See Spot run [...]
fix_sentence_endingsпо умолчанию равно false.Поскольку алгоритм определения предложений опирается на
string.lowercaseдля определения «строчной буквы» и соглашение об использовании двух пробелов после точки для разделения предложений в одной строке, он специфичен для текстов на английском языке.
-
break_long_words¶ (по умолчанию:
True) Если true, слова длиннееwidthбудут разбиты, чтобы ни одна строка не была длиннееwidth. Если false, длинные слова не разбиваются, и некоторые строки могут быть длиннееwidth. (Длинные слова будут размещены на отдельной строке, чтобы минимизировать превышениеwidth.)
-
break_on_hyphens¶ (по умолчанию:
True) Если true, перенос будет выполняться предпочтительно по пробелам и сразу после дефисов в составных словах, как принято в английском. Если false, только пробелы будут считаться потенциально хорошими местами для разрыва строк, но для полного запрета разрыва слов нужно установитьbreak_long_wordsв false. В предыдущих версиях поведение по умолчанию всегда разрешало разрыв слов с дефисом.Новое в версии 2.6.
TextWrapperтакже предоставляет два открытых метода, аналогичных удобным функциям уровня модуля:-
wrap(text)¶ Заворачивает один абзац в текст (строку), так чтобы каждая строка была длиной не более
widthсимволов. Параметры обтекания берутся из атрибутов экземпляраTextWrapper. Возвращает список строк вывода, без конечных символов новой строки. Если завернутый вывод не содержит содержимого, возвращается пустой список.
-
fill(text)¶ Заворачивает один абзац в текст и возвращает одну строку, содержащую завернутый абзац.
-