Zavijanje, krajšanje in oblikovanje nizov v Pythonu z textwrap

Posel

Če želite oblikovati niz v Pythonu tako, da ga ovijete (prekinete vrstico) in skrajšate na poljubno število znakov, uporabite modul textwrap iz standardne knjižnice.

Tu so na voljo naslednje informacije.

  • Ovijanje niza (podajanje vrstice): wrap(),fill()
  • krajšanje nizov (izpuščeno): shorten()
  • Objekt TextWrapper

Če želite dolge nize zapisati v več vrsticah v kodi namesto v izpisu, si oglejte naslednji članek.

Ovijanje niza (podajanje vrstice): wrap(), fill()

S funkcijo wrap() modula textwrap lahko dobite seznam, razdeljen s presledki besed, tako da ustreza poljubnemu številu znakov.

Določite število znakov za širino drugega argumenta. Privzeta vrednost je 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']

S pridobljenim seznamom lahko pridobite niz, ki je prekinjen s kodo nove vrstice, tako da naredite naslednje
'\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

Funkcija fill() namesto seznama vrne niz novih vrstic. To je enako, kot če bi za funkcijo wrap() izvedli naslednjo kodo, kot v zgornjem primeru.
'\n'.join(list)

To je bolj priročno, kadar ne potrebujete seznama, temveč želite na terminal izpisati niz s fiksno širino itd.

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

Če je naveden argument max_line, se število vrstic za njim izpusti.

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

Če ga izpustite, se na koncu privzeto izpiše naslednji niz.
' [...]'

Nadomestite ga lahko s poljubnim nizom z argumentom 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 ~

Z argumentom initial_indent lahko določite tudi niz, ki se doda na začetek prve vrstice. To lahko uporabite, kadar želite narediti alinejo na začetku odstavka.

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 ~

Bodite previdni pri uporabi znakov polne in polovične velikosti.

Pri zavijanju besedila je število znakov odvisno od števila znakov in ne od širine znaka, enobajtni in dvobajtni znaki pa se štejejo za en znak.

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

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

Če želite besedilo z mešanimi znaki kanji oviti s fiksno širino, glejte naslednje.

krajšanje nizov (izpuščeno): shorten()

Če želite skrajšati in izpustiti nize, uporabite funkcijo shorten() v modulu textwrap.

Skrajšano v besednih enotah za poljubno število znakov. Število znakov, vključno z nizom, ki označuje izpustitev, je poljubno. Niz, ki označuje izpustitev, je mogoče nastaviti z argumentom placeholder, ki je privzeto naslednji.
' [...]'

s = 'Python is powerful'

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

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

Vendar japonskih nizov, na primer, ni mogoče dobro skrajšati, ker jih ni mogoče razdeliti na besede.

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

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

Če želite skrajšati tako, da namesto besednih enot upoštevate le število znakov, lahko to preprosto dosežete na naslednji način.

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

Objekt TextWrapper

Če boste funkcijo wrap() ali fill() s fiksno konfiguracijo uporabili večkrat, je učinkovito ustvariti objekt 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 ~

Iste nastavitve lahko ponovno uporabite.