Envelopper, tronquer et formater des chaînes de caractères en Python avec textwrap

Affaires

Pour formater une chaîne de caractères en Python en l'enveloppant (en la coupant à la ligne) et en la tronquant (en l'abrégeant) à un nombre arbitraire de caractères, utilisez le module textwrap de la bibliothèque standard.

Les informations suivantes sont fournies ici.

  • Habillage d'une chaîne de caractères (saut de ligne): wrap(),fill()
  • Tronquer les chaînes de caractères (omis): shorten()
  • Objet TextWrapper

Si vous souhaitez écrire de longues chaînes de caractères sur plusieurs lignes dans le code plutôt que dans la sortie, consultez l'article suivant.

Habillage d'une chaîne de caractères (saut de ligne): wrap(), fill()

Avec la fonction wrap() du module textwrap, vous pouvez faire tenir une liste divisée par des sauts de mots dans un nombre arbitraire de caractères.

Spécifiez le nombre de caractères pour le deuxième argument, la largeur. La valeur par défaut est 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']

En utilisant la liste obtenue, vous pouvez obtenir une chaîne de caractères qui est interrompue par un code de nouvelle ligne en faisant ce qui suit
'\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 fonction fill() renvoie une chaîne de caractères de type newline au lieu d'une liste. C'est la même chose que d'exécuter le code suivant après wrap() comme dans l'exemple ci-dessus.
'\n'.join(list)

C'est plus pratique lorsque vous n'avez pas besoin d'une liste mais que vous voulez sortir une chaîne de largeur fixe sur 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 l'argument max_line est spécifié, le nombre de lignes après celui-ci sera omis.

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 elle est omise, la chaîne suivante sera affichée à la fin par défaut.
' [...]'

Il peut être remplacé par n'importe quelle chaîne de caractères avec l'argument placeholder.

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

Vous pouvez également spécifier une chaîne à ajouter au début de la première ligne avec l'argument initial_indent. Ceci peut être utilisé lorsque vous souhaitez indenter le début d'un paragraphe.

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 ~

Faites attention aux caractères de taille normale et de taille moyenne.

Dans le textwrap, le nombre de caractères est contrôlé par le nombre de caractères, et non par la largeur des caractères, et les caractères à un ou deux octets sont considérés comme un seul caractère.

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

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

Si vous voulez envelopper un texte avec des caractères kanji mixtes avec une largeur fixe, veuillez vous référer à ce qui suit.

Tronquer les chaînes de caractères (omis): shorten()

Si vous souhaitez tronquer et omettre des chaînes de caractères, utilisez la fonction shorten() du module textwrap.

Abrégé en unités de mots pour correspondre à un nombre arbitraire de caractères. Le nombre de caractères, y compris la chaîne indiquant l'omission, est arbitraire. La chaîne indiquant l'omission peut être définie avec l'argument placeholder, qui prend par défaut la valeur suivante.
' [...]'

s = 'Python is powerful'

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

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

Cependant, les chaînes de caractères japonaises, par exemple, ne peuvent pas être bien abrégées car elles ne peuvent pas être divisées en mots.

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

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

Si vous voulez abréger en ne considérant que le nombre de caractères au lieu des unités de mots, vous pouvez facilement le faire comme suit.

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

Objet TextWrapper

Si vous avez l'intention de wrap() ou fill() plusieurs fois avec une configuration fixe, il est efficace de créer un objet 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 ~

Les mêmes paramètres peuvent être réutilisés.

Copied title and URL