Обгортання, обрізання та форматування рядків у Python за допомогою тексту

Бізнес

Щоб відформатувати рядок у Python шляхом обгортання (розриву рядка) та усікання (скорочення) його на довільну кількість символів, використовуйте модуль textwrap стандартної бібліотеки.

Тут наведено наступну інформацію.

  • Обгортання рядка (переведення рядка):wrap(),fill()
  • Обрізати рядки (опущено):shorten()
  • Об’єкт TextWrapper

Якщо ви хочете написати довгі рядки в кількох рядках у коді, а не у виводі, перегляньте наступну статтю.

Обгортання рядка (переведення рядка):wrap(),fill()

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

Вкажіть кількість символів для ширини другого аргументу. За замовчуванням – ширина=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 [...]

Якщо його опустити, наступний рядок буде виведено в кінці за замовчуванням.
[...]'

Його можна замінити будь-яким рядком із заповнювачем аргументу.

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 ~

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

У перенесенні текстом кількість символів контролюється кількістю символів, а не шириною символу, і як однобайтові, так і двобайтові символи розглядаються як один символ.

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

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

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

Обрізати рядки (опущено):shorten()

Якщо ви хочете скоротити та пропустити рядки, скористайтеся функцією shorten() у модулі textwrap.

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

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

Якщо ви збираєтеся використовувати wrap() або fill() багато разів із фіксованою конфігурацією, ефективно створити об’єкт 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 ~

Ті самі налаштування можна використовувати повторно.