Axustar, truncar e formatear cadeas en Python con envoltura de texto

Negocios

Para formatar unha cadea en Python axustándoa (ruptura de liña) e truncándoa (abreviándoa) nun número arbitrario de caracteres, use o módulo textwrap da biblioteca estándar.

A seguinte información ofrécese aquí.

  • Envolver unha cadea (salida de liña):wrap(),fill()
  • Troncar cadeas (omitido):shorten()
  • Obxecto TextWrapper

Se queres escribir cadeas longas en varias liñas no código en lugar de na saída, consulta o seguinte artigo.

Envolver unha cadea (salida de liña):wrap(),fill()

Coa función wrap() do módulo textwrap, podes obter unha lista dividida por quebras de palabras para encaixar nun número arbitrario de caracteres.

Especifique o número de caracteres para o ancho do segundo argumento. O valor predeterminado é 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 a lista obtida, podes obter unha cadea que estea rota por un código de nova liña facendo o seguinte
\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

A función fill() devolve unha cadea de nova liña en lugar dunha lista. É o mesmo que executar o seguinte código despois de wrap() como no exemplo anterior.
\n'.join(list)

Isto é máis cómodo cando non necesitas unha lista pero queres enviar unha cadea de ancho fixo a un terminal, etc.

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 se especifica o argumento max_line, omitirase o número de liñas despois del.

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 se omite, a seguinte cadea sairá ao final por defecto.
[...]'

Pódese substituír por calquera cadea co marcador de posición do argumento.

print(textwrap.fill(s, 40, max_lines=2, placeholder=' ~'))
# Python can be easy to pick up whether
# you're a first time programmer or ~

Tamén pode especificar unha cadea que se engadirá ao comezo da primeira liña co argumento initial_indent. Pódese usar cando se quere sangrar o comezo dun parágrafo.

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 ~

Teña coidado cos personaxes de tamaño completo e de tamaño medio.

No axuste de texto, o número de caracteres está controlado polo número de caracteres, non polo ancho do carácter, e os caracteres dun byte e do dobre son considerados como un só carácter.

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

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

Se queres envolver un texto con caracteres kanji mesturados cun ancho fixo, consulta o seguinte.

Troncar cadeas (omitido):shorten()

Se quere truncar e omitir cadeas, use a función shorten() no módulo textwrap.

Abreviado en unidades de palabras para axustar un número arbitrario de caracteres. O número de caracteres, incluída a cadea que indica a omisión, é arbitrario. A cadea que indica a omisión pódese establecer co marcador de posición do argumento, que é o seguinte por defecto.
[...]'

s = 'Python is powerful'

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

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

Non obstante, as cadeas xaponesas, por exemplo, non se poden abreviar ben porque non se poden dividir en palabras.

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

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

Se queres abreviar considerando só o número de caracteres en lugar de unidades de palabras, pódese conseguir facilmente do seguinte xeito.

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

Obxecto TextWrapper

Se vai envolver() ou encher() moitas veces cunha configuración fixa, é eficiente crear un obxecto 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 ~

Os mesmos axustes pódense reutilizar.