Обвиване, съкращаване и форматиране на низове в Python с textwrap

Бизнес

За форматиране на низ в Python чрез обвиване (прекъсване на реда) и съкращаване (съкращаване) на произволен брой символи използвайте модула textwrap на стандартната библиотека.

Тук се предоставя следната информация.

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

Ако искате да записвате дълги низове на няколко реда в кода, а не в изхода, вижте следната статия.

Обвиване на низ (подаване на ред): wrap(), fill()

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

Посочете броя на символите за ширината на втория аргумент. По подразбиране е 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