Avvolgere, troncare e formattare stringhe in Python con textwrap

Attività commerciale

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.

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.