Envolver, truncar y formatear cadenas en Python con textwrap

Negocio

Para formatear una cadena en Python envolviendo (rompiendo líneas) y truncando (abreviando) en un número arbitrario de caracteres, utilice el módulo textwrap de la biblioteca estándar.

La siguiente información se proporciona aquí.

  • Envolver una cadena (avance de línea): wrap(),fill()
  • Truncar cadenas (omitido): shorten()
  • Objeto TextWrapper

Si desea escribir cadenas largas en varias líneas del código en lugar de en la salida, consulte el siguiente artículo.

Envolver una cadena (avance de línea): wrap(), fill()

Con la función wrap() del módulo textwrap, puede obtener una lista dividida por saltos de palabra para que quepa en un número arbitrario de caracteres.

Especifique el número de caracteres para el segundo argumento ancho. El valor por defecto es 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']

Utilizando la lista obtenida, se puede obtener una cadena rota por un código de nueva línea haciendo lo siguiente
'\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 función fill() devuelve una cadena con una nueva línea en lugar de una lista. Es lo mismo que ejecutar el siguiente código después de wrap() como en el ejemplo anterior.
'\n'.join(list)

Esto es más conveniente cuando no se necesita una lista pero se quiere dar salida a una cadena de ancho fijo en 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

Si se especifica el argumento línea_máxima, se omitirá el número de líneas que le siguen.

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

Si se omite, se emitirá por defecto la siguiente cadena al final.
' [...]'

Se puede sustituir por cualquier cadena con el argumento marcador de posición.

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

También puede especificar una cadena que se añadirá al principio de la primera línea con el argumento sangría_inicial. Esto puede utilizarse cuando se desea aplicar una sangría al principio de un párrafo.

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 ~

Tenga cuidado con los caracteres de tamaño normal y medio.

En textwrap, el número de caracteres se controla por el número de caracteres, no por la anchura de los mismos, y tanto los caracteres de un byte como los de doble byte se consideran un solo carácter.

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

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

Si desea envolver un texto con caracteres kanji mixtos con una anchura fija, consulte lo siguiente.

Truncar cadenas (omitido): shorten()

Si desea truncar y omitir cadenas, utilice la función shorten() del módulo textwrap.

Abreviado en unidades de palabras para que quepa un número arbitrario de caracteres. El número de caracteres, incluida la cadena que indica la omisión, es arbitrario. La cadena que indica la omisión puede establecerse con el argumento marcador de posición, que por defecto es el siguiente.
' [...]'

s = 'Python is powerful'

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

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

Sin embargo, las cadenas japonesas, por ejemplo, no se pueden abreviar bien porque no se pueden dividir en palabras.

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

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

Si desea abreviar teniendo en cuenta sólo el número de caracteres en lugar de las unidades de palabras, puede hacerlo fácilmente de la siguiente manera.

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

Objeto TextWrapper

Si va a envolver() o llenar() muchas veces con una configuración fija, es eficiente crear un objeto 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 ~

Se pueden reutilizar los mismos ajustes.

Copied title and URL