Per formattare una stringa in Python avvolgendola (spezzando la linea) e troncandola (abbreviandola) ad un numero arbitrario di caratteri, usate il modulo textwrap della libreria standard.
Le seguenti informazioni sono fornite qui.
- Avvolgere una stringa (line feed):
wrap()
,fill()
- Troncare le stringhe (omesso):
shorten()
- Oggetto TextWrapper
Se volete scrivere lunghe stringhe su più righe nel codice invece che nell'output, vedete il seguente articolo.
- Articoli correlati:Scrivere lunghe stringhe di testo su più righe in Python
Avvolgere una stringa (line feed): wrap(), fill()
Con la funzione wrap() del modulo textwrap, si può ottenere una lista divisa da interruzioni di parola per adattarla a un numero arbitrario di caratteri.
Specifica il numero di caratteri per la larghezza del secondo argomento. Il valore predefinito è 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']
Usando l'elenco ottenuto, si può ottenere una stringa interrotta da un codice newline facendo quanto segue'\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
La funzione fill() restituisce una stringa newline invece di una lista. È lo stesso che eseguire il seguente codice dopo wrap() come nell'esempio precedente.'\n'.join(list)
Questo è più conveniente quando non hai bisogno di una lista ma vuoi emettere una stringa a larghezza fissa su un terminale, ecc.
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
Se l'argomento max_line è specificato, il numero di linee dopo di esso sarà omesso.
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 [...]
Se omesso, la seguente stringa sarà emessa alla fine per default.' [...]'
Può essere sostituito da qualsiasi stringa con l'argomento segnaposto.
print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~'))
# Python can be easy to pick up whether
# you're a first time programmer or ~
Potete anche specificare una stringa da aggiungere all'inizio della prima riga con l'argomento initial_indent. Questo può essere usato quando si vuole far rientrare l'inizio di un paragrafo.
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 ~
Fate attenzione ai caratteri a grandezza naturale e a quelli a metà grandezza.
In textwrap, il numero di caratteri è controllato dal numero di caratteri, non dalla larghezza del carattere, e sia i caratteri a singolo byte che quelli a doppio byte sono considerati come un carattere.
s = '文字文字文字文字文字文字12345,67890, 文字文字文字abcde'
print(textwrap.fill(s, 12))
# 文字文字文字文字文字文字
# 12345,67890,
# 文字文字文字abcde
Se volete avvolgere un testo con caratteri kanji misti con una larghezza fissa, fate riferimento a quanto segue.
Troncare le stringhe (omesso): shorten()
Se volete troncare e omettere delle stringhe, usate la funzione shorten() nel modulo textwrap.
Abbreviato in unità di parola per adattarsi a un numero arbitrario di caratteri. Il numero di caratteri, inclusa la stringa che indica l'omissione, è arbitrario. La stringa che indica l'omissione può essere impostata con l'argomento segnaposto, che per default è il seguente.' [...]'
s = 'Python is powerful'
print(textwrap.shorten(s, 12))
# Python [...]
print(textwrap.shorten(s, 12, placeholder=' ~'))
# Python is ~
Tuttavia, le stringhe giapponesi, per esempio, non possono essere abbreviate bene perché non possono essere divise in parole.
s = 'Pythonについて。Pythonは汎用のプログラミング言語である。'
print(textwrap.shorten(s, 20))
# [...]
Se volete abbreviare considerando solo il numero di caratteri invece delle unità di parola, si può ottenere facilmente come segue.
s_short = s[:12] + '...'
print(s_short)
# Pythonについて。P...
Oggetto TextWrapper
Se avete intenzione di avvolgere() o riempire() molte volte con una configurazione fissa, è efficiente creare un oggetto 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 ~
Le stesse impostazioni possono essere riutilizzate.