Hvis du vil formatere en streng i Python ved at ombryde den ved et vilkårligt antal tegn, skal du bruge textwrap-modulet i standardbiblioteket.
Her findes følgende oplysninger.
- Indpakning af en streng (linjeføring):
wrap()
,fill()
- Truncate strings (udeladt):
shorten()
- TextWrapper-objekt
Hvis du ønsker at skrive lange strenge på flere linjer i koden i stedet for i output, kan du læse følgende artikel.
- Relaterede artikler:Skrivning af lange tekststrenge på flere linjer i Python
Indpakning af en streng (linjeføring): wrap(), fill()
Med funktionen wrap() i textwrap-modulet kan du få en liste opdelt med ordbrud, så den passer ind i et vilkårligt antal tegn.
Angiv antallet af tegn for det andet argument bredde. Standardværdien er 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']
Ved hjælp af den opnåede liste kan du få en streng, der er afbrudt af en newline-kode, ved at gøre følgende'\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
Funktionen fill() returnerer en newline-streng i stedet for en liste. Det er det samme som at udføre følgende kode efter wrap() som i eksemplet ovenfor.'\n'.join(list)
Dette er mere praktisk, når du ikke har brug for en liste, men ønsker at udskrive en streng med fast bredde til en terminal osv.
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
Hvis argumentet max_line er angivet, vil antallet af linjer efter det blive udeladt.
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 [...]
Hvis den udelades, vil følgende streng som standard blive outputet i slutningen.' [...]'
Den kan erstattes af en hvilken som helst streng med argumentet 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 ~
Du kan også angive en streng, der skal tilføjes i begyndelsen af den første linje med argumentet initial_indent. Dette kan bruges, når du ønsker at indrykke begyndelsen af et afsnit.
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 ~
Vær forsigtig med tegn i fuld størrelse og halve størrelser.
I textwrap styres antallet af tegn af antallet af tegn og ikke af tegnbredden, og både single-byte- og double-byte-tegn betragtes som ét tegn.
s = '文字文字文字文字文字文字12345,67890, 文字文字文字abcde'
print(textwrap.fill(s, 12))
# 文字文字文字文字文字文字
# 12345,67890,
# 文字文字文字abcde
Hvis du ønsker at ombryde en tekst med blandede kanji-tegn med en fast bredde, skal du se følgende.
Truncate strings (udeladt): shorten()
Hvis du ønsker at afkorte og udelade strenge, skal du bruge funktionen shorten() i textwrap-modulet.
Forkortet i ord-enheder for at passe til et vilkårligt antal tegn. Antallet af tegn, herunder den streng, der angiver udeladelsen, er vilkårligt. Den streng, der angiver udeladelsen, kan indstilles med argumentet placeholder, som som er standardiseret til følgende.' [...]'
s = 'Python is powerful'
print(textwrap.shorten(s, 12))
# Python [...]
print(textwrap.shorten(s, 12, placeholder=' ~'))
# Python is ~
Men japanske strenge kan f.eks. ikke forkortes godt, fordi de ikke kan opdeles i ord.
s = 'Pythonについて。Pythonは汎用のプログラミング言語である。'
print(textwrap.shorten(s, 20))
# [...]
Hvis du ønsker at forkortere ved kun at tage hensyn til antallet af tegn i stedet for ord enheder, kan det nemt gøres på følgende måde.
s_short = s[:12] + '...'
print(s_short)
# Pythonについて。P...
TextWrapper-objekt
Hvis du skal wrap() eller fill() mange gange med en fast konfiguration, er det effektivt at oprette et TextWrapper-objekt.
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 ~
De samme indstillinger kan genbruges.