Couper une chaîne au bout de 72 caractères, sans couper les mots

Le
Denis Bitouzé
Bonsoir,

je souhaite envoyer des mails via un script python (dans un site
Plone) en respectant la règle préconisant de ne pas dépasser 72
caractères par ligne, tout en ne coupant pas les mots.

Le problème est que le contenu du message n'est pas forcément
prévisible (certaines phrases contiennent des valeurs de variables)
donc je ne peux pas le pré-formater.

Vu que je suis assez pressé et pas expert en python, loin de là, je
m'en remets à vous pour trouver une façon simple de faire cela.

Merci d'avance.
--
Denis
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Maurette
Le #19576991
Denis Bitouzé, le 15/06/2009 a écrit :
Bonsoir,

je souhaite envoyer des mails via un script python (dans un site
Plone) en respectant la règle préconisant de ne pas dépasser 72
caractères par ligne, tout en ne coupant pas les mots.

Le problème est que le contenu du message n'est pas forcément
prévisible (certaines phrases contiennent des valeurs de variables)
donc je ne peux pas le pré-formater.

Vu que je suis assez pressé et pas expert en python, loin de là, je
m'en remets à vous pour trouver une façon simple de faire cela.



Confronté au même problème, et vu que j'étais prassé et pas expert en
python, j'ai fait:
python word wrap
dans Google, et la première réponse m'a permis de copier - coller -
modifier un truc qui semble fonctionnel:

La fonction:

def wrap(text, width):
"""
A word-wrap function that preserves existing line breaks
and most spaces in the text. Expects that existing line
breaks are posix newlines (n).
"""
return reduce(lambda line, word, width=width: '%s%s%s' %
(line,
' n'[(len(line)-line.rfind('n')-1
+ len(word.split('n',1)[0]
) >= width)],
word),
text.split(' ')
)

--
Pierre Maurette
Denis Bitouzé
Le #19577711
Le mardi 16/06/09 à 11h33,
Pierre Maurette
python word wrap



Ah, ce que j'ignorais, c'est que « Couper une chaîne au bout de 72
caractères, sans couper les mots » se traduisait en anglais par « word
wrap ». Quel sens du raccourci, ces anglophones ! ;)

Merci !
--
Denis
pdorange
Le #19579071
Denis Bitouzé
> python word wrap

Ah, ce que j'ignorais, c'est que « Couper une chaîne au bout de 72
caractères, sans couper les mots » se traduisait en anglais par « word
wrap ». Quel sens du raccourci, ces anglophones ! ;)



Word Wrap, c'est "retour à la ligne automatique", ou "couper sur les
mots" en français.
Ce qui n'est guère plus long, mais l'anglais est un langue très forte
pour métamorphoser des concepts en une petite suite de mots, c'est un
des forces de cette langue.

--
Pierre-Alain Dorange
Ce message est sous licence Creative Commons "by-nc-sa-2.0"
Pierre Quentel
Le #19579651
On 15 juin, 20:26, Denis Bitouzé
Bonsoir,

je souhaite envoyer des mails via un script python (dans un  site
Plone) en respectant la règle préconisant de ne pas dépasser 72
caractères par ligne, tout en ne coupant pas les mots.

Le problème est que le contenu du message n'est pas forcément
prévisible (certaines phrases contiennent des valeurs de variables)
donc je ne peux pas le pré-formater.

Vu que je suis assez pressé et pas expert en python, loin de là, je
m'en remets à vous pour trouver une façon simple de faire cela.

Merci d'avance.
--
Denis



Bonjour,

La bibliothèque standard de Python contient un module textwrap qui
fait exactement ce que tu recherches :

import textwrap
lignes = textwrap.wrap(texte,longueur_max)

renvoie les lignes correspondant au texte découpé en chaînes de
caractères d'au plus longueur_max

Quelqu'un le mentionne d'ailleurs dans les commentaires de la recette
sur ActiveState citée par Pierre

Dans pas mal de cas, pour trouver si la bibliothèque standard réalise
une fonction donnée, le plus simple est de parcourir la table des
matières ; ici tu l'aurais trouvée, sans surprise, dans la rubrique
"String Services"

- Pierre
Sysadmin
Le #19593731
Pierre Quentel a écrit :
On 15 juin, 20:26, Denis Bitouzé
Bonsoir,

je souhaite envoyer des mails via un script python (dans un site
Plone) en respectant la règle préconisant de ne pas dépasser 72
caractères par ligne, tout en ne coupant pas les mots.

Le problème est que le contenu du message n'est pas forcément
prévisible (certaines phrases contiennent des valeurs de variables)
donc je ne peux pas le pré-formater.

Vu que je suis assez pressé et pas expert en python, loin de là, j e
m'en remets à vous pour trouver une façon simple de faire cela.

Merci d'avance.
--
Denis



Bonjour,

La bibliothèque standard de Python contient un module textwrap qui
fait exactement ce que tu recherches :

import textwrap
lignes = textwrap.wrap(texte,longueur_max)

renvoie les lignes correspondant au texte découpé en chaînes de
caractères d'au plus longueur_max

Quelqu'un le mentionne d'ailleurs dans les commentaires de la recette
sur ActiveState citée par Pierre

Dans pas mal de cas, pour trouver si la bibliothèque standard réali se
une fonction donnée, le plus simple est de parcourir la table des
matières ; ici tu l'aurais trouvée, sans surprise, dans la rubrique
"String Services"

- Pierre


Batteries included comme disent les anglo-saxons.
candide
Le #19608901
Pierre Maurette a écrit :

return reduce(lambda line, word, width=width: '%s%s%s' %




À noter quand même que reduce() est voué à la disparition, cf.
http://www.python.org/dev/peps/pep-3100/
Pierre Maurette
Le #19617741
candide, le 21/06/2009 a écrit :
Pierre Maurette a écrit :

return reduce(lambda line, word, width=width: '%s%s%s' %




À noter quand même que reduce() est voué à la disparition, cf.
http://www.python.org/dev/peps/pep-3100/



Peut-être, encore que pas mal de code doit trimbaler du reduce(), mais
peu importe. J'ai simplement répondu une connerie, parce que la
question restait sans réponse et que j'avais ça dans mes cartons(*).
Mais en Python, quand textwrap existe dans le paquetage de base, faire
autre chose est simplement une erreur. J'ai d'ailleurs corrigé mes
archives à la lecture de la contribution de Pierre Quentel.

(*) Pire, au moment où j'avais pompé ce truc, je ne comprenais pas
comment ça marchait...

--
Pierre Maurette
Publicité
Poster une réponse
Anonyme