Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

7 réponses
Avatar
Denis Bitouzé
Bonsoir,

je souhaite envoyer des mails via un script python (dans un site
Plone) en respectant la r=E8gle pr=E9conisant de ne pas d=E9passer 72
caract=E8res par ligne, tout en ne coupant pas les mots.

Le probl=E8me est que le contenu du message n'est pas forc=E9ment
pr=E9visible (certaines phrases contiennent des valeurs de variables)
donc je ne peux pas le pr=E9-formater.

Vu que je suis assez press=E9 et pas expert en python, loin de l=E0, je
m'en remets =E0 vous pour trouver une fa=E7on simple de faire cela.

Merci d'avance.
--=20
Denis

7 réponses

Avatar
Pierre Maurette
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:
<URL:http://code.activestate.com/recipes/148061/>

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
Avatar
Denis Bitouzé
Le mardi 16/06/09 à 11h33,
Pierre Maurette a écrit :

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
Avatar
pdorange
Denis Bitouzé wrote:

> 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 <http://microwar.sourceforge.net/>

Ce message est sous licence Creative Commons "by-nc-sa-2.0"
<http://creativecommons.org/licenses/by-nc-sa/2.0/fr/>
Avatar
Pierre Quentel
On 15 juin, 20:26, Denis Bitouzé wrote:
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
Avatar
Sysadmin
Pierre Quentel a écrit :
On 15 juin, 20:26, Denis Bitouzé wrote:
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.
Avatar
candide
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/
Avatar
Pierre Maurette
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