Embolcall, truncat i format de cadenes en Python amb textwrap

Negocis

Per formatar una cadena en Python embolicant (salt de línia) i truncant-la (abreujant) amb un nombre arbitrari de caràcters, utilitzeu el mòdul textwrap de la biblioteca estàndard.

La informació següent es proporciona aquí.

  • Embolcall d’una cadena (alimentació de línia):wrap(),fill()
  • Troncar les cadenes (omès):shorten()
  • Objecte TextWrapper

Si voleu escriure cadenes llargues en diverses línies al codi en comptes de fer-ho a la sortida, consulteu l’article següent.

Embolcall d’una cadena (alimentació de línia):wrap(),fill()

Amb la funció wrap() del mòdul textwrap, podeu obtenir una llista dividida per salts de paraula perquè encaixi en un nombre arbitrari de caràcters.

Especifiqueu el nombre de caràcters per a l’amplada del segon argument. El valor per defecte és 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']

Utilitzant la llista obtinguda, podeu obtenir una cadena trencada per un codi de nova línia fent el següent
\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ó fill() retorna una cadena de nova línia en lloc d’una llista. És el mateix que executar el codi següent després de wrap() com a l’exemple anterior.
\n'.join(list)

Això és més convenient quan no necessiteu una llista però voleu enviar una cadena d’amplada fixa 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

Si s’especifica l’argument max_line, s’ometrà el nombre de línies posteriors.

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 s’omet, la cadena següent sortirà al final de manera predeterminada.
[...]'

Es pot substituir per qualsevol cadena amb el marcador de posició d’argument.

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

També podeu especificar una cadena que s’afegirà al començament de la primera línia amb l’argument initial_indent. Això es pot utilitzar quan es vol sagnar l’inici d’un paràgraf.

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 ~

Aneu amb compte amb els caràcters de mida completa i mitja.

A l’ajustament de text, el nombre de caràcters es controla pel nombre de caràcters, no per l’amplada del caràcter, i tant els caràcters d’un byte com els de doble byte es consideren com un caràcter.

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

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

Si voleu embolicar un text amb caràcters kanji barrejats amb una amplada fixa, consulteu el següent.

Troncar les cadenes (omès):shorten()

Si voleu truncar i ometre cadenes, utilitzeu la funció shorten() al mòdul textwrap.

Abreujat en unitats de paraula per adaptar-se a un nombre arbitrari de caràcters. El nombre de caràcters, inclosa la cadena que indica l’omissió, és arbitrari. La cadena que indica l’omissió es pot establir amb el marcador de posició de l’argument, que per defecte és el següent.
[...]'

s = 'Python is powerful'

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

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

Tanmateix, les cordes japoneses, per exemple, no es poden abreujar bé perquè no es poden dividir en paraules.

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

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

Si voleu abreujar tenint en compte només el nombre de caràcters en comptes de les unitats de paraules, es pot aconseguir fàcilment de la següent manera.

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

Objecte TextWrapper

Si aneu a wrap() o fill() moltes vegades amb una configuració fixa, és eficient crear un objecte 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 ~

Els mateixos paràmetres es poden reutilitzar.