Zawijanie, obcinanie i formatowanie ciągów znaków w Pythonie za pomocą textwrap

Biznes

Aby sformatować ciąg znaków w Pythonie przez zawijanie (łamanie linii) i obcinanie (skracanie) go o dowolną liczbę znaków, należy użyć modułu textwrap biblioteki standardowej.

Podane są tu następujące informacje.

  • Zawijanie łańcucha (podawanie linii): wrap(),fill()
  • Obcinanie ciągów znaków (pominięte): shorten()
  • Obiekt TextWrapper

Jeśli chcesz pisać długie ciągi znaków w wielu liniach kodu zamiast w danych wyjściowych, zobacz poniższy artykuł.

Zawijanie łańcucha (podawanie linii): wrap(), fill()

Za pomocą funkcji wrap() modułu textwrap, możesz uzyskać listę podzieloną na słowa tak, aby zmieściła się w dowolnej liczbie znaków.

Określa liczbę znaków dla drugiego argumentu width. Domyślnie jest to 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']

Używając otrzymanej listy, możesz uzyskać ciąg znaków, który jest przerwany przez kod nowej linii, wykonując następujące czynności
'\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

Funkcja fill() zwraca łańcuch z nową linią zamiast listy. Jest to tożsame z wykonaniem poniższego kodu po funkcji wrap() jak w powyższym przykładzie.
'\n'.join(list)

Jest to wygodniejsze, gdy nie potrzebujesz listy, ale chcesz wyprowadzić łańcuch o stałej szerokości do terminala, itp.

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

Jeśli podano argument max_line, liczba wierszy po nim zostanie pominięta.

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 [...]

Jeśli zostanie pominięty, to domyślnie na końcu zostanie wyprowadzony następujący łańcuch.
' [...]'

Można go zastąpić dowolnym ciągiem znaków z argumentem 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 ~

Możesz również określić łańcuch, który ma być dodany do początku pierwszej linii za pomocą argumentu initial_indent. Może to być użyte, gdy chcesz wcięcia na początku akapitu.

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 ~

Należy uważać na znaki pełnowymiarowe i półpełnowymiarowe.

W textwrap liczba znaków jest kontrolowana przez liczbę znaków, a nie przez szerokość znaków, a zarówno znaki jedno- jak i dwubajtowe są traktowane jako jeden znak.

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

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

Jeśli chcesz zawinąć tekst zawierający mieszane znaki kanji o stałej szerokości, zapoznaj się z poniższymi wskazówkami.

Obcinanie ciągów znaków (pominięte): shorten()

Jeśli chcesz obcinać i pomijać ciągi znaków, użyj funkcji shorten() w module textwrap.

Skrócony w jednostkach słownych, aby zmieścić dowolną liczbę znaków. Liczba znaków, łącznie z łańcuchem wskazującym na pominięcie, jest dowolna. Łańcuch wskazujący na pominięcie można ustawić przy pomocy argumentu placeholder, który domyślnie przyjmuje wartość następującą.
' [...]'

s = 'Python is powerful'

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

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

Jednakże, na przykład japońskie ciągi znaków nie mogą być dobrze skracane, ponieważ nie można ich podzielić na słowa.

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

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

Jeśli chcesz dokonać skrótu, biorąc pod uwagę tylko liczbę znaków zamiast jednostek słownych, można to łatwo osiągnąć w następujący sposób.

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

Obiekt TextWrapper

Jeśli zamierzasz zawijać() lub wypełniać() wiele razy z ustaloną konfiguracją, efektywnie jest utworzyć obiekt 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 ~

Te same ustawienia mogą być ponownie wykorzystane.