Wikkelen, afkappen en formatteren van strings in Python met textwrap

Bedrijf

Om een string in Python op te maken door deze te omwikkelen (line breaking) en af te kappen (abunceren) tot een willekeurig aantal karakters, gebruik je de textwrap module van de standaard bibliotheek.

De volgende informatie wordt hier verstrekt.

  • Een string omwikkelen (line feed): wrap(),fill()
  • Tekenreeksen afkappen (weggelaten): shorten()
  • TextWrapper object

Als je lange strings op meerdere regels in de code wilt schrijven in plaats van in de uitvoer, zie dan het volgende artikel.

Een string omwikkelen (line feed): wrap(), fill()

Met de functie wrap() van de textwrap module, kan je een lijst opgedeeld door woordafbrekingen laten passen in een willekeurig aantal karakters.

Specificeer het aantal karakters voor het tweede argument width. De standaardwaarde is 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']

Met behulp van de verkregen lijst kunt u een string krijgen die wordt onderbroken door een newline code door het volgende te doen
'\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

De functie fill() retourneert een newline string in plaats van een lijst. Het is hetzelfde als het uitvoeren van de volgende code na wrap() zoals in het voorbeeld hierboven.
'\n'.join(list)

Dit is handiger wanneer je geen lijst nodig hebt maar een string met een vaste breedte naar een terminal wilt sturen, enz.

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

Als het argument max_line wordt opgegeven, wordt het aantal regels erna weggelaten.

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

Indien weggelaten, wordt standaard de volgende string aan het eind uitgevoerd.
' [...]'

Het kan vervangen worden door een willekeurige string met het argument 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 ~

U kunt ook een tekenreeks specificeren die moet worden toegevoegd aan het begin van de eerste regel met het argument initial_indent. Dit kan gebruikt worden wanneer je het begin van een paragraaf wil laten inspringen.

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 ~

Wees voorzichtig met hele en halve tekens.

In textwrap wordt het aantal tekens bepaald door het aantal tekens, niet door de tekenbreedte, en zowel single-byte als double-byte tekens worden als één teken beschouwd.

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

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

Als u een tekst met gemengde kanji-tekens met een vaste breedte wilt omwikkelen, raadpleeg dan het volgende.

Tekenreeksen afkappen (weggelaten): shorten()

Als je strings wilt inkorten en weglaten, gebruik dan de functie inkorten() in de textwrap module.

Afgekort in woordeenheden om in een willekeurig aantal tekens te passen. Het aantal tekens, inclusief de tekenreeks die de weglating aangeeft, is willekeurig. De tekenreeks die de weglating aangeeft, kan worden ingesteld met het argument plaatshouder, dat standaard het volgende is.
' [...]'

s = 'Python is powerful'

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

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

Japanse strings, bijvoorbeeld, kunnen echter niet goed worden afgekort omdat ze niet in woorden kunnen worden verdeeld.

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

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

Als u wilt afkorten door alleen te kijken naar het aantal tekens in plaats van naar woordeenheden, kan dat gemakkelijk als volgt.

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

TextWrapper object

Als je veelvuldig wrap() of fill() gaat gebruiken met een vaste configuratie, is het efficiënt om een TextWrapper object te maken.

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 ~

Dezelfde instellingen kunnen worden hergebruikt.

Copied title and URL