Embalagem, truncagem e formatação de cordas em Python com envoltório de texto

O negócio

Para formatar uma corda em Python, envolvendo-a (quebra de linha) e truncando-a (abreviando-a) a um número arbitrário de caracteres, utilize o módulo de embrulho de texto da biblioteca padrão.

A seguinte informação é fornecida aqui.

  • Envolver um cordel (avanço de linha): wrap(),fill()
  • Cordas truncadas (omitidas): shorten()
  • Objecto TextWrapper

Se quiser escrever longas cordas em várias linhas no código em vez de na saída, ver o artigo seguinte.

Envolver um cordel (avanço de linha): wrap(), fill()

Com a função wrap() do módulo textwrap, pode obter uma lista dividida por quebras de palavras para caber num número arbitrário de caracteres.

Especificar o número de caracteres para a segunda largura de argumento. O padrão é 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 a lista obtida, pode obter uma string que é quebrada por um novo código de linha, fazendo 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 função fill() devolve uma nova cadeia de linhas em vez de uma lista. É o mesmo que executar o seguinte código após wrap() como no exemplo acima.
'\n'.join(list)

Isto é mais conveniente quando não se precisa de uma lista mas se quer produzir um fio de largura fixa para um 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 o argumento max_line for especificado, o número de linhas depois será omitido.

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 omitido, a seguinte cadeia será produzida no final, por defeito.
' [...]'

Pode ser substituído por qualquer cordel com o argumento do local 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 ~

Pode também especificar uma cadeia a ser adicionada ao início da primeira linha com o argumento initial_indent. Isto pode ser utilizado quando se pretende recuar o início de um 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 ~

Ter cuidado com os caracteres de tamanho normal e de tamanho médio.

No caso de texto, o número de caracteres é controlado pelo número de caracteres, e não pela largura dos caracteres, e tanto os caracteres de byte simples como os de byte duplo são considerados como um caracter.

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

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

Se quiser embrulhar um texto com caracteres kanji mistos com uma largura fixa, consulte o seguinte.

Cordas truncadas (omitidas): shorten()

Se quiser truncar e omitir cordas, utilize a função encurtar() no módulo de embrulho de texto.

Abreviado em unidades de palavras para caber um número arbitrário de caracteres. O número de caracteres, incluindo a cadeia que indica a omissão, é arbitrário. A cadeia de caracteres que indica a omissão pode ser definida com o argumento do lugar do argumento, o que não corresponde ao seguinte.
' [...]'

s = 'Python is powerful'

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

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

No entanto, as cordas japonesas, por exemplo, não podem ser bem abreviadas porque não podem ser divididas em palavras.

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

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

Se quiser abreviar, considerando apenas o número de caracteres em vez de unidades de palavras, pode ser facilmente alcançado da seguinte forma.

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

Objecto TextWrapper

Se vai embrulhar() ou preencher() muitas vezes com uma configuração fixa, é eficiente criar um objecto 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 ~

As mesmas configurações podem ser reutilizadas.

Copied title and URL