Outils pour utilisateurs

Outils du site


cours:informatique:fun_mooc:python3_uca_inria:220_chaines_de_caracteres

Python: les chaînes de caractères

Dans cette vidéo, nous allons parler des chaînes de caractères et notamment de comment gérer l'encodage avec les chaînes de caractères. Ouvrons un interpréteur Python pour commencer à jouer avec ces chaînes de caractères.

Pour créer une chaîne de caractères, c'est très simple en Python, vous n'avez qu'à l'entourer soit par des apostrophes, donc par exemple je fais la chaîne de caractères 'spam', ou alors par des guillemets. Voilà, ça crée deux chaînes de caractères totalement équivalentes. Maintenant, je vais affecter ma chaîne de caractères à une variable pour pouvoir la manipuler. Les chaînes de caractères sont des objets immuables, ça veut dire qu'une fois qu'ils ont été créés, on ne peut plus les modifier. Les chaînes de caractères contiennent également de nombreuses méthodes qui permettent de manipuler ces chaînes de caractères. Comme je viens de l'expliquer, les chaînes de caractères sont immuables, ça veut dire que toutes les opérations, toutes les méthodes, les fonctions qui manipulent les chaînes de caractères vont retourner un nouvel objet chaîne de caractères.

Vous pouvez vous demander mais comment je fais pour connaître toutes les méthodes qui existent sur les chaînes de caractères. Python a l'avantage d'être un langage auto-documenté, ça veut dire que vous pouvez très facilement interroger depuis un interpréteur l'aide Python. Regardons un exemple. Je sais que les chaînes de caractères, c'est le type str, je peux donc directement écrire str point d'interrogation, cette opération point d'interrogation n'est possible que depuis un interpréteur IPython ou depuis un notebook. Regardons ce que j'obtiens, j'obtiens une aide succincte sur le type chaîne de caractères. Je peux également accéder à l'intégralité des méthodes qui existent sur un objet particulier, en utilisant la fonction built-in dir. Donc, si je fais dir de str, je vais voir toutes les méthodes qui sont associées aux chaînes de caractères. Vous avez remarqué que vous avez certaines méthodes qui commencent et finissent par des doubles underscores, nous ne parlerons pas de ces méthodes pour le moment, nous reviendrons dessus dans de prochaines vidéos puisqu'il s'agit d'un sujet avancé lié aux méthodes spéciales.

Donc pour l'instant, concentrons-nous sur les méthodes qui utilisent simplement un nom sans underscore. Nous remarquons que ces méthodes ont des noms qui ont l'air assez explicites. Par exemple, la méthode title, essayons cette méthode title, donc j'écris *“un mooc sur python”*. Comment est-ce que j'appelle cette méthode ? Simplement en mettant un point title. Exécutons cette méthode et regardons le résultat. En fait, cette méthode title va simplement mettre chaque mot avec la première lettre en majuscule. J'ai également une méthode replace donc pour ça, je vais écrire s égale 'le poulet… alors comme j'ai une apostrophe, je vais l'entourer par des guillemets, je vais écrire “le poulet c'est bon”. Donc vous voyez ici l'intérêt d'avoir la notation guillemets et apostrophes, c'est de pouvoir par exemple mettre une apostrophe dans une chaîne de caractères en l'entourant par des guillemets sans avoir à mettre un backslash devant, une barre oblique inversée. Donc j'écris: s égale “le poulet c'est bon” et je peux maintenant faire un replace de poulet par spam. Et regardons, j'obtiens une nouvelle chaîne de caractères qui va être “le spam c'est bon”. Évidemment, comme c'est un nouvel objet chaîne de caractères puisque les chaînes de caractères sont immuables, je peux réaffecter le retour de cette méthode sur les chaînes de caractères à ma chaîne de caractères s pour obtenir une chaîne de caractères référencée par s qui référence “le spam c'est bon”.

J'ai ensuite, sur les chaînes de caractères, un certain nombre de méthodes qui me permettent de faire des comparaisons, ou de faire des tests. Regardons un exemple. J'ai une chaîne de caractères qui représente un entier qui est 123, et avant de le convertir, je pourrais vouloir m'assurer que cette chaîne de caractères représente bien un nombre décimal. Et bien, je peux faire ça avec la méthode isdecimal qui va simplement me retourner vrai si la chaîne de caractères représente un nombre décimal, et faux sinon. Encore une fois, je vous invite à regarder l'intégralité des méthodes qui existent sur les chaînes de caractères puisque ces méthodes sont très puissantes et très souvent, répondent aux besoins que vous avez de manipulation de ces chaînes.

Pour finir, regardons comment formater une chaîne de caractères. Je vais prendre l'exemple suivant : je vais écrire n égale le prénom Sonia et je vais écrire age égale 30. Et maintenant, j'aimerais écrire “Sonia a 30 ans”. En Python, on utilise pour cela ce qu'on appelle l'instruction format qui permet de formater une chaîne de caractères en fonction de certaines variables. Je vais écrire accolade accolade point format de n virgule age, et que va faire l'instruction format ? Elle va substituer le premier argument que je lui passe, n, à la première accolade, et le deuxième argument que je lui passe, age, à la deuxième accolade. Ça me permet donc d'obtenir une chaîne de caractères qui est sonia 30. Revenons sur cette chaîne de caractères, “sonia” je vais écrire un tout petit peu plus de texte “a Et on remarque qu'il y a une petite limitation à ce format, c'est que ce n'est pas complètement expressif puisque j'écris des accolades vides avec ensuite point format.

Depuis Python 3.6, il est possible de créer ce qu'on appelle des f-strings. C'est quelque chose d'extrêmement pratique et qu'on vous recommande d'utiliser systématiquement. Je mets simplement un f devant ma chaîne de caractères et entre les accolades, je vais mettre la variable que je veux substituer. Donc ici, je vais mettre n, et ici, je vais mettre age. Le résultat de l'évaluation de cette chaîne de caractères va être “sonia a 30 ans”, j'ai maintenant une chaîne de caractères totalement expressive.

# W2-S2-2 Les chaînes de caractères (suite)

Parlons maintenant du support Unicode en Python 3 Donc à ce propos je vous fais remarquer que le support natif d'Unicode n'existe qu'en python 3 et pas en python 2, c'est une excellente raison de passer à Python 3. Donc regardons un exemple de chaîne de caractère en python. Donc je vais écrire une chaîne de caractères comme par exemple Noël, été … non je recommence été, voilà. Donc là j'ai une chaîne de caractère avec des caractères accentués avec un ë et des é accents et on voit que cette chaîne est parfaitement supportée par Python. Donc lorsque je veux rentrer le caractère avec mon clavier si j'ai une méthode de saisie par le clavier pour rentrer mon caractère je peux le rentrer directement à l'aide du clavier mais je peux également rentrer le caractère Unicode avec la notation \u.

Donc regardons par exemple un caractère Unicode “\u03a6” qui est un code qui correspond à un caractère dans le jeu de caractères Unicode et je veux obtenir la lettre Phi. Regardons maintenant un 2ème caractère “\u0556” qui correspond à la lettre arménienne Feh. Exécutons et regardons ce que je vois. Je vois en fait un rectangle vide à la place de mon caractère. En fait quel est le problème ici ? le problème c'est que j'utilise une police de caractères qui ne supporte pas ce caractère. Donc il faut comprendre qu'en fait lorsque l'on parle d'Unicode, nous avons un jeu de caractères qui supporte l'intégralité des caractères du monde mais pour afficher ce caractère sur votre écran vous avez besoin d'une police de caractères qui est capable de dessiner un glyphe correspondant à ce caractère. Donc ici ma police de caractères ne le supporte pas, par contre j'ai une police de caractères qui le supporte. Donc pour se faire je vais aller dans mon interpréteur et je vais prendre une police qui s'appelle 'DejaVu Sans mono” C'est une police qui est connu sous Windows pour supporter un grand nombre de caractères et donc ici je vois maintenant mon fameux caractère je remets mon interpréteur en plein écran, mon fameux caractère \u0556 correspond bien maintenant à la lettre arménienne Feh.

Revenons maintenant à la notion de codage et de décodage, je vous rappelle que sur votre ordinateur vous avez un flux de bits que vous pouvez avoir à lire lorsque vous lisez ce flux de bits, vous devez décoder ce flux de bits pour obtenir les lettres et de manière inverse lorsque vous voulez écrire ces lettres sur un disque dur ou les envoyer sur internet c'est-à-dire les transformer en flux de bits vous devez les encoder. En fait cette opération de décodage et d'encodage a été rendue extrêmement simple en python. Dès que vous manipulez des chaînes de caractères en Unicode vous utilisez le type 'str'. Dès que vous manipulez des flux de bits vous utilisez le type bytes et python vous permet de très facilement passer des chaînes de caractères en bytes et des bytes aux chaînes de caractères.

Regardons un exemple : s = “un noël en été”, j'ai donc une chaîne de caractères Unicode qui contient des caractères accentués donc je fais un print() de s, je vois bien la chaîne de caractères. Maintenant si je veux encoder ma chaîne de caractère en bytes, j'utilise une méthode sur les chaînes de caractères qui est la méthode encode. Je vais utiliser encode, je vais donner l'encodage que je veux utf-8, je vous rappelle que par défaut on utilise toujours utf-8 sauf si on a une très bonne raison de faire autrement mais en général on n'a pas de très bonnes raisons de faire autrement et donc là je vais obtenir un nouvel objet, remarquez ce nouvel objet : c'est une chaîne de caractères qui commence avec un petit b et ensuite qui contient des caractères particuliers. En fait le type bytes va contenir uniquement des octets, c'est-à-dire des octets codés sur 8 bits et python vous offre la possibilité que lorsque l'octet représente un caractère ASCII qui a un affichage sous forme de lettre ou sous forme de chiffre, il va vous afficher cette lettre ou ce chiffre. Cependant c'est juste une facilité et python va bien coder les bytes sous forme d'octet et non pas sous forme de caractère. Donc maintenant j'ai ma chaîne de caractères qui a été encodée donc je vais l'appeler 'en', voici ma chaîne de caractères je peux maintenant la décoder pour repasser au type 'str', au type chaîne de caractères Unicode. Donc je vais faire un decode() et là encore je vais lui passer le codec que j'utilise qui est utf-8 … … et donc je vais ré-obtenir ma chaîne de caractère. Evidemment vous pouvez utiliser d'autres type d'encodage. Donc regardons un autre exemple, je reprends ma chaîne de caractères s et je peux très bien l'encoder en latin1 qui est un autre encodage et de même je pourrais la décoder en latin1. Ce qui est très important c'est de ne jamais mélanger les encodages et les décodages. C'est pour ça qu'on vous recommande de toujours utiliser utf-8 qui a la caractéristique importante d'être un encodage qui supporte Unicode.

En résumé, les principaux problèmes qui existent aujourd'hui avec l'encodage et le décodage ne sont pas liés au jeu de caractères puisqu'on a Unicode, ils sont quasiment toujours liés au fait que la personne qui développe le code ne vous communique pas le bon encodage utilisé. Par conséquent c'est pour cela qu'on vous recommande toujours d'utiliser utf-8 de toujours exactement contrôler votre encodage donc de bien encoder et décoder les chaînes de caractères et de toujours dire à la personne ou aux personnes qui vont utiliser votre code quel type d'encodage vous utilisez.

cours/informatique/fun_mooc/python3_uca_inria/220_chaines_de_caracteres.txt · Dernière modification : 2021/05/17 08:33 de 92.154.112.189