Aller au contenu principal

Manipulation de caractères

👨‍🏫 Introduction

Objectif

Ces travaux pratiques ont pour objectif de vous familiariser avec la manipulation des caractères et des chaînes de caractères en Python.

Préparation

Afin de garder organisées les productions réalisées en travaux pratiques, veuillez mettre à jour l'arborescence du dossier NSI en fonction l'ordinateur utilisé :

💻 Ordinateur portable
  1. Lancer l'explorateur de fichiers
  2. Se rendre dans le dossier Documents
  3. Créer le dossier NSI s'il n'existe pas
  4. Dans le dossier NSI, créer le dossier chapitre_10
  5. Dans le dossier chapitre_10, créer le dossier tp1_manipulation_caracteres
🖥 Ordinateur fixe des salles informatiques
  1. Depuis le bureau, cliquer sur l'icône intitulée Zone personnelle
  2. Créer le dossier NSI s'il n'existe pas
  3. Dans le dossier NSI, créer le dossier chapitre_10
  4. Dans le dossier chapitre_10, créer le dossier tp1_manipulation_caracteres

Téléchargement des fichiers

Pour effectuer ce TP, il est nécessaire de télécharger certains fichiers :

  1. Télécharger le fichier ZIP contenant les fichiers du TP : 📦 télécharger
  2. Ouvrir le fichier ZIP
  3. Copier/coller tous les fichiers dans le dossier NSI\chapitre_10\tp1_manipulation_caracteres

Partie 1 - Identifier les caractéristiques d'un fichier

Le dossier partie1 contient quatre fichiers dont vous devez identifier certaines propriétés en étudiant leur contenu à l'aide d'un éditeur hexadécimal. Un éditeur hexadécimal est un logiciel d'édition binaire de fichiers. Dans le cadre de ces travaux pratiques, vous utiliserez l'application en ligne : HexEdit

Les propriétés à identifier sont les suivantes :

  • Type - est-il question d'un fichier texte brut (ne contenant que du texte) ou d'un autre type de fichier (contenant des données binaires autre que du texte. Préciser le format identifié) ?
  • Système - s'il est question d'un fichier texte brut, a-t-il été créé sous Windows ou sous Linux/MacOS X ?
  • Encodage - s'il est question d'un fichier texte brut, identifier l'encodage utilisé parmi les suivants : ASCII, ISO-8859-1 et UTF-8

Écrire les réponses le fichier texte partie1/reponses.txt (à créer)

FichierTypeSystèmeEncodage
mystere1
mystere2
mystere3
mystere4
💡 Aide - Identifier un fichier Windows ou Linux/MacOS X

Rechecher des sauts de ligne
Sous Windows les sauts de ligne nécessitent 2 octets (0D 0A pour CR LF) alors que sous Linux ou MacOS X, ceux-ci ne nécessitent qu'un seul octet (0A pour LF).

💡 Aide - Identifier l'encodage ISO-8859-1 ou UTF-8

Rechecher un caractère accentué tel que "é"
Le code du caractère é est E9 en ISO-8859-1 et C3 A9 en UTF-8.

Partie 2 - Accès à la valeur d'un caractère

En Python, la fonction ord() permet d'obtenir le code décimal Unicode d'un caractère. La fonction chr() permet l'inverse, c'est-à-dire obtenir un caractère à partir d'un code décimal Unicode.

Répondre aux questions suivantes en utilisant la console Python :

  • Que renvoie l'appel de fonction ord('a') ? Est-ce cohérent avec la table ASCII ? Si oui, comment est-ce possible alors qu'il s'agit de codes Unicode ?
  • Quelle est la valeur de l'expression hex(ord('a')) ? Est-ce bien cohérent avec la table ASCII ?
  • Que renvoie l'appel de fonction chr(98) ?
  • Que renvoie l'appel de fonction chr(0x62) ?
  • Quelle est la valeur de l'expression 'é'.encode('utf-8') ?
    Consultez la page Web https://www.compart.com/fr/unicode/U+00E9. Comprenez-vous ce à quoi correspond C3 A9 ?
  • Quelle est la valeur de l'expression chr(ord('a') + 2) ? Comment l'expliquez-vous ?
  • Remplacer le ? de l'expression chr(ord('a') + ?) de façon à ce que la lettre renvoyée soit un z
  • Tester les expressions ord('a')-ord('A') puis ord('z')-ord('Z'). Qu'observez-vous ? Sauriez-vous donner une explication ?
  • Remplacer le ? l'expression chr(ord('M') + ?), sans utiliser de valeur numérique, de façon à ce que la lettre renvoyée soit un m

Partie 3 - L'alphabet

Affichage de l'alphabet

Écrire la procédure afficher_alphabet qui affiche les lettres de l'alphabet de a à z en respectant les contraintes suivantes :

  • L'usage des tableaux n'est pas autorisé
  • Le code ne doit faire apparaître qu'un seul appel à la fonction print (et non 26).
    (La fonction print pourra cependant être appelée plusieurs fois à l'aide d'une boucle par exemple)
  • Il n'est pas autorisé d'afficher plus d'un caractère par appel de la fonction print

Création d'un tableau de l'alphabet

Écrire l'expression d'un tableau en compréhension contenant les lettres de l'alphabet de a à z.

Partie 4 - Création d'une chaîne de caractères

Écrire une fonction qui, à partir d'un tableau contenant le code numérique de caractères, reconstruit une chaîne de caractères.

  1. Ouvrir le fichier partie4/main.py
  2. Compléter la fonction contruire_chaine
  3. Tester en exécutant le script Python

Partie 5 - Fonctions utilitaires

En Python, il est possible d’accéder aux caractères d'une chaîne de la même façon qu'il est possible d'accéder aux éléments d'un tableau :

chaine = "abc"

# Parcours par indice
for i in range(len(chaine)):
print(chaine[i], ord(chaine[i]))

# Parcours par valeur
for caractere in chaine:
print(caractere, ord(caractere))

Écrire les fonctions suivantes dans le fichier partie5/main.py (à créer). Chaque fonction devra disposer d'une docstring et de doctests.

  1. Écrire la fonction est_numerique qui prend en paramètre une chaîne de caractères chaine et qui renvoie True si elle ne contient que des chiffres, False sinon
  2. Écrire la fonction est_majuscule qui prend en paramètre une chaîne de caractères c ne comportant qu'un seul caractère et qui renvoie True s'il s'agit d'une majuscule ASCII, False sinon
  3. Écrire la fonction contient_majuscule qui prend en paramètre une chaîne de caractères chaine et qui renvoie True si elle contient une majuscule, False sinon
  4. Écrire la fonction convertir_minuscule qui prend en paramètre une chaîne de caractères chaine et qui renvoie la même chaîne entièrement en minuscules
  5. Écrire la fonction nettoyer_chaine qui prend en paramètre une chaîne de caractères chaine et qui renvoie la même chaîne entièrement en minuscules avec tous les caractères non alphabétique supprimés (à l'exception des espaces)

Partie 6 - Programme complet

Écrire un programme qui charge en mémoire un fichier en langue française au format utf-8/Linux (utiliser le fichier partie6/poeme.txt) et qui effectue les traitements suivants :

  • Suppression de tous les caractères accentués
  • Passage de tous les caractères en minuscule
  • Remplacement des sauts de ligne par un espace
  • Affichage du contenu du fichier à l'écran
Attention

Vous n'êtes pas autorisés à utiliser les méthodes de chaînes de caractères telles que replace() ou lower().

💡 Aide - Lecture d'un fichier en Python

Comparer les caractères accentués directement avec des chaînes sans utiliser la fonction ord. Une astuce :

f = open("fichier.txt", "r") # ouverture du fichier en lecture seule
chaine = f.read() # affectation du contenu du fichier à une chaîne de caractères
💡 Aide - Suppression de tous les caractères accentués

Comparer les caractères accentués directement avec des chaînes sans utiliser la fonction ord. Une astuce :

if c in "éèëê" :
...
💡 Aide - Remplacement des sauts de ligne

Pour rappel, un saut de ligne correspond au caractère \n.

🏆 Bonus
  • Faire en sorte qu'on puisse lancer le script sur n'importe quel fichier en utilisant les paramètres d'appel d'un script (chercher comment utiliser sys.argv ou argparse)
  • Enregistrer le résultat dans un fichier dont le nom est passé en paramètre du script Python (chercher comment écrire dans un fichier en Python)