> **Источник:** https://python-all.ru/3.1/library/textwrap.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 7.5. `textwrap` – Перенос и заполнение текста

Модуль `textwrap` предоставляет две вспомогательные функции – [`wrap()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.wrap) и [`fill()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.fill), а также [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper) – класс, который делает всю работу, и служебную функцию [`dedent()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.dedent). Если нужно перенести или заполнить одну-две текстовые строки, достаточно вспомогательных функций; в противном случае для эффективности лучше использовать экземпляр [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper).

#### `textwrap.wrap(text, width=70, **kwargs)`

Переносит единственный абзац в *text* (строку) так, что каждая строка не длиннее *width* символов. Возвращает список выходных строк, без завершающих символов новой строки.

Необязательные именованные аргументы соответствуют атрибутам экземпляра [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper), описанным ниже. *width* по умолчанию равен `70`.

#### `textwrap.fill(text, width=70, **kwargs)`

Обёртывает единственный абзац в *text* и возвращает одну строку, содержащую обёрнутый абзац. [`fill()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.fill) – это сокращённая запись для

```python
"\n".join(wrap(text, ...))
```

В частности, [`fill()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.fill) принимает те же именованные аргументы, что и [`wrap()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.wrap).

И [`wrap()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.wrap), и [`fill()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.fill) работают, создавая экземпляр [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper) и вызывая на нём один метод. Этот экземпляр не переиспользуется, поэтому для приложений, которые переносят/заполняют много текстовых строк, будет эффективнее создать собственный объект [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper).

Текст предпочтительно переносится по пробелам и сразу после дефисов в составных словах; только в этом случае длинные слова будут разбиты при необходимости, если [`TextWrapper.break_long_words`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.break_long_words) не установлено в false.

Дополнительная служебная функция [`dedent()`](https://python-all.ru/3.1/library/textwrap.html#textwrap.dedent) предназначена для удаления отступов из строк, содержащих нежелательные пробелы слева от текста.

#### `textwrap.dedent(text)`

Удаляет общие начальные пробельные символы из каждой строки в *text*.

Это можно использовать, чтобы выровнять строки с тройными кавычками по левому краю отображения, при этом в исходном коде они остаются с отступами.

Обратите внимание, что табуляции и пробелы оба считаются пробельными символами, но они не равны: строки `" hello"` и `"\thello"` считаются не имеющими общего начального пробела.

Например:

```python
def test():
    # завершите первую строку символом \, чтобы избежать пустой строки
    s = '''\
    hello
      world
    '''
    print(repr(s))          # выводит '    hello\n      world\n    '
    print(repr(dedent(s)))  # выводит 'hello\n  world\n'
```

#### `class textwrap.TextWrapper(**kwargs)`

Конструктор [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper) принимает ряд необязательных именованных аргументов. Каждый именованный аргумент соответствует атрибуту экземпляра, так, например,

```python
wrapper = TextWrapper(initial_indent="* ")
```

это то же самое, что

```python
wrapper = TextWrapper()
wrapper.initial_indent = "* "
```

Можно повторно использовать один и тот же объект [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper) много раз, и между использованиями можно изменять любые его параметры прямым присваиванием атрибутам экземпляра.

Атрибуты экземпляра [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper) (и именованные аргументы конструктора) следующие:

#### `width`

(по умолчанию:

`70`

) Максимальная длина переносимых строк. Пока во входном тексте нет отдельных слов длиннее

[`width`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.width)

,

[`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper)

гарантирует, что ни одна строка вывода не будет длиннее

[`width`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.width)

символов.

#### `expand_tabs`

(по умолчанию:

`True`

) Если истинно, то все символы табуляции в

*text*

будут заменены на пробелы с использованием метода

`expandtabs()`

строки

*text*

.

#### `replace_whitespace`

(по умолчанию: `True`) Если истина, каждый пробельный символ (по определению `string.whitespace`), оставшийся после замены табуляции, будет заменён на один пробел.

> **Примечание**
>
> Если [`expand_tabs`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.expand_tabs) ложно, а [`replace_whitespace`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.replace_whitespace) истинно, то каждый символ табуляции будет заменён одним пробелом, что *не* то же самое, что замена табуляции.

> **Примечание**
>
> Если [`replace_whitespace`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.replace_whitespace) ложно, символы новой строки могут оказаться в середине строки и привести к странному выводу. По этой причине текст следует разбивать на абзацы (с помощью [`str.splitlines()`](https://python-all.ru/3.1/library/stdtypes.html#str.splitlines) или аналогично), которые переносятся отдельно.

#### `drop_whitespace`

(по умолчанию:

`True`

) Если истина, пробелы, которые после переноса оказываются в начале или конце строки, удаляются (однако начальные пробелы в первой строке всегда сохраняются).

#### `initial_indent`

(по умолчанию:

`''`

) Строка, которая будет добавлена в начало первой строки вывода после переноса. Учитывается при подсчёте длины первой строки.

#### `subsequent_indent`

(по умолчанию:

`''`

) Строка, которая будет добавлена ко всем строкам перенесённого вывода, кроме первой. Учитывается в длине каждой строки, кроме первой.

#### `fix_sentence_endings`

(по умолчанию: `False`) Если true, [`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper) пытается обнаружить концы предложений и гарантировать, что предложения всегда разделяются ровно двумя пробелами. Обычно это желательно для текста моноширинным шрифтом. Однако алгоритм обнаружения предложений несовершенен: он предполагает, что конец предложения состоит из строчной буквы, за которой следует один из `'.'`, `'!'` или `'?'`, возможно, за которым следует один из `'"'` или `"'"`, за которым следует пробел. Одна из проблем этого алгоритма заключается в том, что он не может различить «Dr.» в

```python
[...] Dr. Frankenstein's monster [...]
```

и «Spot.» в

```python
[...] See Spot. See Spot run [...]
```

[`fix_sentence_endings`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.fix_sentence_endings) по умолчанию false.

Поскольку алгоритм обнаружения предложений полагается на `string.lowercase` для определения «строчной буквы» и соглашение об использовании двух пробелов после точки для разделения предложений на одной строке, он применим только к текстам на английском языке.

#### `break_long_words`

(по умолчанию:

`True`

) Если true, то слова длиннее

[`width`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.width)

будут разрываться, чтобы гарантировать, что ни одна строка не длиннее

[`width`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.width)

. Если false, длинные слова не будут разрываться, и некоторые строки могут оказаться длиннее

[`width`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.width)

. (Длинные слова будут помещаться на отдельную строку, чтобы минимизировать превышение

[`width`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.width)

.)

#### `break_on_hyphens`

(по умолчанию:

`True`

) Если true, перенос будет выполняться предпочтительно по пробелам и сразу после дефисов в составных словах, как это принято в английском языке. Если false, только пробелы будут считаться потенциально хорошими местами для разрыва строк, но необходимо установить

[`break_long_words`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.break_long_words)

в false, если требуются действительно неразрывные слова. Поведение по умолчанию в предыдущих версиях заключалось в том, чтобы всегда разрешать разрыв слов с дефисом.

[`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper) также предоставляет два открытых метода, аналогичных модульным удобным функциям:

#### `wrap(text)`

Переносит один абзац из

*text*

(строки) так, чтобы каждая строка была не длиннее

[`width`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper.width)

символов. Все параметры переноса берутся из атрибутов экземпляра

[`TextWrapper`](https://python-all.ru/3.1/library/textwrap.html#textwrap.TextWrapper)

. Возвращает список строк вывода без завершающих символов новой строки.

#### `fill(text)`

Заворачивает один абзац в

*текст*

и возвращает одну строку, содержащую завернутый абзац.
