Обертывание, усечение и форматирование строк в Python с помощью textwrap

Бизнес

Чтобы отформатировать строку в Python, обернув ее (перевод строки) и усекая (сокращая) на произвольное количество символов, используйте модуль textwrap стандартной библиотеки.

Здесь представлена следующая информация.

  • Обертывание строки (перевод строки): wrap(),fill()
  • Усечение строк (опущено): shorten()
  • Объект TextWrapper

Если вы хотите писать длинные строки на нескольких строках в коде, а не в выводе, смотрите следующую статью.

Обертывание строки (перевод строки): wrap(), fill()

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

Укажите количество символов для второго аргумента width. По умолчанию используется значение width=70.

import textwrap

s = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages"

s_wrap_list = textwrap.wrap(s, 40)
print(s_wrap_list)
# ['Python can be easy to pick up whether', "you're a first time programmer or you're", 'experienced with other languages']

Используя полученный список, вы можете получить строку, прерванную кодом новой строки, выполнив следующие действия
'\n'.join(list)

print('\n'.join(s_wrap_list))
# Python can be easy to pick up whether
# you're a first time programmer or you're
# experienced with other languages

Функция fill() возвращает строку с новой строкой вместо списка. Это то же самое, что выполнить следующий код после wrap(), как в примере выше.
'\n'.join(list)

Это удобнее, когда вам не нужен список, но вы хотите вывести на терминал строку фиксированной ширины и т.д.

print(textwrap.fill(s, 40))
# Python can be easy to pick up whether
# you're a first time programmer or you're
# experienced with other languages

Если указан аргумент max_line, количество строк после него будет опущено.

print(textwrap.wrap(s, 40, max_lines=2))
# ['Python can be easy to pick up whether', "you're a first time programmer or [...]"]

print(textwrap.fill(s, 40, max_lines=2))
# Python can be easy to pick up whether
# you're a first time programmer or [...]

Если опущено, то по умолчанию в конце будет выведена следующая строка.
' [...]'

Его можно заменить любой строкой с аргументом placeholder.

print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~'))
# Python can be easy to pick up whether
# you're a first time programmer or ~

Вы также можете указать строку, которая будет добавлена в начало первой строки с аргументом initial_indent. Это можно использовать, когда нужно сделать отступ в начале абзаца.

print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~', initial_indent='  '))
#   Python can be easy to pick up whether
# you're a first time programmer or ~

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

В textwrap количество символов контролируется количеством символов, а не шириной символов, и как однобайтовые, так и двухбайтовые символы рассматриваются как один символ.

s = '文字文字文字文字文字文字12345,67890, 文字文字文字abcde'

print(textwrap.fill(s, 12))
# 文字文字文字文字文字文字
# 12345,67890,
# 文字文字文字abcde

Если вы хотите обернуть текст со смешанными символами кандзи с фиксированной шириной, обратитесь к следующему.

Усечение строк (опущено): shorten()

Если вы хотите усекать и опускать строки, используйте функцию shorten() в модуле textwrap.

Сокращение в единицах слов, чтобы уместить произвольное количество символов. Количество символов, включая строку, указывающую на пропуск, является произвольным. Строка, указывающая на пропуск, может быть задана с помощью аргумента placeholder, который по умолчанию имеет следующее значение.
' [...]'

s = 'Python is powerful'

print(textwrap.shorten(s, 12))
# Python [...]

print(textwrap.shorten(s, 12, placeholder=' ~'))
# Python is ~

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

s = 'Pythonについて。Pythonは汎用のプログラミング言語である。'

print(textwrap.shorten(s, 20))
# [...]

Если вы хотите сократить, учитывая только количество символов вместо единиц слова, этого можно легко добиться следующим образом.

s_short = s[:12] + '...'
print(s_short)
# Pythonについて。P...

Объект TextWrapper

Если вы собираетесь обернуть() или заполнить() много раз с фиксированной конфигурацией, эффективно создать объект TextWrapper.

wrapper = textwrap.TextWrapper(width=30, max_lines=3, placeholder=' ~', initial_indent='  ')

s = "Python can be easy to pick up whether you're a first time programmer or you're experienced with other languages"

print(wrapper.wrap(s))
# ['  Python can be easy to pick', "up whether you're a first time", "programmer or you're ~"]

print(wrapper.fill(s))
#   Python can be easy to pick
# up whether you're a first time
# programmer or you're ~

Одни и те же настройки можно использовать повторно.

Copied title and URL