Sites


Initiation à python

Plus sur le type chaîne (str)

Nous nous attarderons un peu sur le type string.  En effet, la manipulation de chiffre avec les langages de programmation ne pose en général pas d'autres difficultés que les compétences mathématiques de l'auteur. Le texte, en comparaison, peut sembler d'un fonctionnement un peu étrange.

Le terme chaîne déjà peut surprendre et pourtant il exprime bien la réalité des choses : il s'agit d'une suite de lettres comme des maillons sont les éléments d'une chaîne métallique. Cela induit plusieurs choses qui rendent le texte «informatique» un peu différent de celui du quotidien :

  • lorsque nous parlons, notre expression est fluide et continue, nous ne parlons pas lettre par lettre
  • lorsque nous parlons, nous utilisons des structures grammaticales (sujet, verbes compléments…) dont aucun logiciel n'a nativement connaissance. Le mot lui-même est quelque chose de difficilement repérable.

Tout cela induit des difficultés qui ne sont pas insurmontables mais qui demandent un peu de démonstration parce que le texte est souvent une élément très important d'un projet informatique.

Allons donc petit à petit dans les détails :

texte = "Mon texte pour commencer"
print(texte)
> Mon texte pour commencer

Écrire avec des guillemets

Remarquez à nouveau qu'une chaîne se définit entre guillemets. Si vous omettez les guillemets voici ce qui se passe :

texte = Mon texte pour commencer
  File "<stdin>", line 1
    texte = Mon texte pour commencer 
SyntaxError: invalid syntax

Bref, cela ne marche pas. En revanche, si votre texte doit lui-même contenir des guillemets, un autre problème va se poser :

texte = "L’ouvreuse m’a dit : "Donnez-moi votre ticket." Je le lui ai donné."
  File "<stdin>", line 1
    texte = "L’ouvreuse m’a dit : "Donnez-moi votre ticket." Je le lui ai donné."
                                            ^
SyntaxError: invalid syntax

Même erreur. Dans le premier cas, le guillemet manquait ici il est en trop. En fait, python interprète le guillemet avant Donnez comme le guillemet de fermeture de la chaîne et ne comprend pas ce qui se passe par la suite. Il existe plusieurs solutions pour contourner cette difficulté :

Utiliser des guillemets simples

La solution la plus simple consiste à utiliser des guillemets simples (apostrophe) en remplacement de guillemets doubles :

 texte = 'Mon texte "essai" pour commencer'
>>> print (texte)
Mon texte "essai" pour commencer

Cela marche bien ici, mais posera un problème dans cet autre exemple :

texte = 'L'ouvreuse m’a dit : "Donnez-moi votre ticket." Je le lui ai donné.'
  File "<stdin>", line 1
    texte = 'L'ouvreuse m’a dit : "Donnez-moi votre ticket." Je le lui ai donné.'
                      ^
SyntaxError: invalid syntax

Comme des apostrophes sont présentes dans le texte, il y a ici un nouveau conflit. Dans des cas comme ceux-ci, un peu complexe, il faudra trouver une autre solution.

Échapper les caractères avec \

L'échappement de caractère consiste à différencier au sein du texte les caractères a priori identiques mais qui doivent être traités de façon différente par python. Il s'agit de dire : ceci est du code python, et ceci fait partie du texte à afficher.

Le principe est simple : il suffit d'ajouter un \ devant les guillemets ou caractères qui appartiennent au texte à afficher :

 texte = "L'ouvreuse m'a dit : \"Donnez-moi votre ticket.\" Je le lui ai donné."
>>> print (texte)
L'ouvreuse m'a dit : "Donnez-moi votre ticket." Je le lui ai donné.

Le problème est souvent de savoir ce qu'il faut échapper. Généralement, il s'agit de tout caractère syntaxique du langage python qui peut entrer en conflit avec un caractère du texte. Par chance, python a limité au maximum sa syntaxe pour remplacer l'utilisation de caractères par l'indentation, donc cela arrive ici moins souvent que d'autres langages.

Globalement, il s'agit de :

" a remplacer par \"

' a remplacer par \'

et de \ a remplacer par \

Le caractère d'échappement est aussi utilisé dans un contexte légèrement différent lorsqu'il s'agit d'utiliser des caractères invisibles.

Les caractères spéciaux

Il s'agit toujours de quelque chose de spécial, ces caractères spéciaux. Tout est de avoir ce qui est spécial ou pas. Pour un anglais, un é est un caractère spécial, pas pour nous. il pourra donc sembler étrange à certains.

La méthode traditionnelle pour écrire des caractères est d'utiliser leur valeur dans la table des caractères ASCII avec chr() :

print (chr(102))
> f

le problème est d'avoir accès à de vrais caractères étranges :

print (chr(255))
> ?
print (chr(196))
> ?

Ici, ces caractères sont simplement introuvables d'où le résultat identique. Il faudra utiliser unichr() en remplacement :

print (unichr(255))
> ÿ
print (unichr(196))
> Ä

Reste donc à connaître la correspondance entre ces chiffres et le caractère recherché. Un petit tour sur http://fr.wikipedia.org/wiki/Table_des_caractères_Unicode_(0000-0FFF)  peut aider.

Parmi les caractères spéciaux, on retrouve les caractères invisibles du texte, en général ceux qui permettent de faire des retours à la ligne ou des tabulations. Dans ces cas très fréquents, python intègre des solutions standards utilisées dans de nombreux langages par des lettres de raccourci échappées \n pour une nouvelle ligne et \t pour une tabulation.

texte = "L'ouvreuse m'a dit : \n\t\"Donnez-moi votre ticket.\" \nJe le lui ai donné."
print (texte )                                                 

>
L'ouvreuse m'a dit :
    "Donnez-moi votre ticket."
Je le lui ai donné.

Agir sur le texte

Modifier la casse

Passer le texte en majuscule ou en minuscule peut avoir plusieurs usages : en particulier, il permet de faciliter des recherches (voir ci-dessous) ou encore d'augmenter la lisibilité en différenciant les lettres dans le terminal sur lequel il n'est pas possible de faire de différenciation de style (gras, italique...).

Python possède 2 fonctions de changement de casse : mettre en majuscule avec upper(), mettre en minuscule avec lower().

cherche = texte.upper()
print (cherche)
> L'OUVREUSE M'A DIT : "DONNEZ-MOI VOTRE TICKET." JE LE LUI AI DONNé.
cherche = texte.lower()
print (cherche)
> l'ouvreuse m'a dit : "donnez-moi votre ticket." je le lui ai donné.

Chercher une lettre ou un mot

Dans les processus d'automatisation, il n'est pas rare d'avoir à comparer des données. Dans un texte, nous aurons parfois besoin de savoir si une portion de texte est incluse dans une autre. Cette opération s'effectue à l'aide de la méthode find. 

texte = "L'ouvreuse m'a dit : \"Donnez-moi votre ticket.\" Je le lui ai donné."
texte.find("ticket")
> 39
texte.find("billet")
> -1

Le résultat, s'il est valide, renvoie la position de l'occurence dans le texte. Ainsi si le résultat est inférieur à 0 c'est que le texte n'a pas été trouvé. Comme les lettres majuscules et minuscules représentent des caractères différents en ASCII ou unicode, il est compréhensible que python n'y soit pas indifférent et les différencie lors de la recherche.

texte.find("don")
> 61
texte.find("Don")
> 22

Pour faire des recherches un ignorant la casse, il faudra soit modifier la casse du texte avant recherche soit utiliser des expressions régulières (qu 'il n'est pas encore temps de voir).

Attention car find ne retourne que la première occurence trouvée, même s'il n'y en a plusieurs.

Remplacer une partie du texte

Il en est de même du remplacement. Il suffira d'utiliser la fonction replace() pour remplacer toutes les occurences d'un texte par autre.

print (texte.replace("ticket","billet"))
L'ouvreuse m'a dit : "Donnez-moi votre billet." Je le lui ai donné.
texte = "L'ouvreuse m'a dit : \"Donnez-moi votre ticket.\" Je le lui ai donné ce ticket."
print (texte.replace("ticket","billet"))
> L'ouvreuse m'a dit : \"Donnez-moi votre billet.\" Je le lui ai donné ce billet.

Découper le texte

Enfin, il est parfois nécessaire d'avoir de portions du texte. Cela est particulièrement vrai dans différents formats textes comme le CSV ou autre. Imaginons simplement des données utilisateurs contenant ces informations

M,Alphonse,1932

  M pour le sexe, Alphonse pour le prénom, et 1932 pour la date de naissance.  En tant que chaîne, chacune des informations n'a pas de réalité en propre. En utilisant split(), python aura connaissance que nous souhaitons les traiter différemment. Il suffira de placer dans les parenthèses le caractère présent dans le texte qui doit servir à faire le découpage :

texte = "M,Alphonse,1932"
texte.split(",")
> ['M', 'Alphonse', '1932']

Le texte obtenu n'est plus une chaîne, mais une liste qui, elle, se manipule différemment, c'est ce qu'il est temps de voir.

Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.

Vous devriez rafraîchir la page.