Сообщить об ошибке.

Форматирование абзацев текста, модуль textwrap

Исходный код можно найти: Lib/textwrap.py

Модуль textwrap может использоваться для форматирования текста в ситуациях, когда требуется красивая печать. Он предлагает функциональность, аналогичную функциям заполнения абзацев, которые можно найти во многих текстовых редакторах и текстовых процессорах.

В приметах будет использоваться следующий текст:

text = '''
    Модуль `textwrap` может использоваться для форматирования
    текста в ситуациях, когда требуется красивая печать. Он предлагает 
    функциональность, которую можно найти в текстовых редакторах.
    '''

Форматирование параграфа.

Функция textwrap.fill() принимает текст в качестве входных данных и возвращает отформатированный текст.

import textwrap as tw

print(tw.fill(text, width=50))
#      Модуль `textwrap` может использоваться для
# форматирования     текста в ситуациях, когда
# требуется красивая печать. Он предлагает
# функциональность, которую можно найти в текстовых
# редакторах.

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

Удаление отступа параграфа.

Удаление общего префикса пробела из всех строк в тексте образца функцией textwrap.dedent() приводит к лучшим результатам и позволяет использовать многострочные строки прямо из кода Python, удаляя при этом форматирование самого кода.

import textwrap as tw

print(tw.dedent(text))
# Модуль `textwrap` может использоваться для форматирования
# текста в ситуациях, когда требуется красивая печать. Он предлагает 
# функциональность, которую можно найти в текстовых редакторах.

Так как dedent() является противоположностью indent(), результатом является блок текста с общим начальным пробелом из каждой строки. Если одна строка уже имеет отступ больше другой, часть пробела не будет удалена, например

# Было
␣Line one.
␣␣␣Line two.
␣Line three.

# Станет
Line one.
␣␣Line two.
Line three.

Регулирование ширины параграфа.

Текст с отступами может быть передан textwrap.fill() с несколькими различными width значениями.

import textwrap as tw

dedented_text = tw.dedent(text).strip()
for width in [50, 70]:
    print('=> {} Columns:'.format(width))
    print(tw.fill(dedented_text, width=width))
    print()

# => 50 Columns:
# Модуль `textwrap` может использоваться для
# форматирования текста в ситуациях, когда требуется
# красивая печать. Он предлагает  функциональность,
# которую можно найти в текстовых редакторах.

# => 70 Columns:
# Модуль `textwrap` может использоваться для форматирования текста в
# ситуациях, когда требуется красивая печать. Он предлагает
# функциональность, которую можно найти в текстовых редакторах.

Префикс во всех строках параграфа.

Используйте функцию textwrap.indent(), чтобы добавить текст префикса ко всем строкам в параграфе. В этом примере форматируется текст, с использованием префикса > для каждой строки.

import textwrap as tw

dedented_text = tw.dedent(text)
wrap = tw.fill(dedented_text, width=50)
final = tw.indent(wrap, '> ')
print(final)
# >  Модуль `textwrap` может использоваться для
# > форматирования текста в ситуациях, когда требуется
# > красивая печать. Он предлагает  функциональность,
# > которую можно найти в текстовых редакторах

Блок текста разбивается на новые строки, префикс добавляется к каждой строке, содержащей текст, а затем строки объединяются обратно в новую строку и возвращаются.

Префикс в строках параграфа по условию.

Чтобы контролировать, какие строки получают новый префикс, передадим объект в качестве predicate аргумента функции textwrap.indent(). Этот объект будет вызываться для каждой строки текста по очереди, а префикс будет добавляться для строк, в которых возвращаемое значение равно True.

import textwrap as tw

def my_indent(line):
    return line.startswith(' ')

dedented_text = tw.dedent(text)
wrap = tw.fill(dedented_text, width=65)
final = tw.indent(wrap, '> ', predicate=my_indent)
print(final)
# >  Модуль `textwrap` может использоваться для форматирования текста
# в ситуациях, когда требуется красивая печать. Он предлагает
# функциональность, которую можно найти в текстовых редакторах.

Висячие отступы.

Отступ первой строки можно контролировать независимо от последующих строк. Это позволяет создать висячий отступ, где первая строка имеет отступ меньше, чем другие строки.

import textwrap as tw

dedented_text = tw.dedent(text).strip()
print(tw.fill(dedented_text, initial_indent='',
                    subsequent_indent=' ' * 4, width=60))

# Модуль `textwrap` может использоваться для форматирования
#     текста в ситуациях, когда требуется красивая печать. Он
#     предлагает  функциональность, которую можно найти в
#     текстовых редакторах.

Значения отступа могут включать и непробельные символы.

Усеченный длинный текст.

Чтобы обрезать текст для создания сводки или предварительного просмотра, будем использовать функцию shorten() модуля textwrap. Все существующие пробелы, такие как табуляция, новые строки и серии из нескольких пробелов, будут стандартизированы в один пробел. Затем текст будет обрезан до длины, меньшей или равной запрошенной, между границами слов, чтобы не было частичных слов.

import textwrap as tw

dedented_text = tw.dedent(text)
short = tw.shorten(dedented_text, 100)
short_wrap = tw.fill(short, width=60)
print(short_wrap)
# Модуль `textwrap` может использоваться для форматирования
# текста в ситуациях, когда требуется [...]

Если текст без пробелов удаляется из исходного текста как часть усечения, он заменяется значением заполнителя. Значение по умолчанию [...] можно заменить, указав аргумент placeholder для функции shorten().