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
- Lancer l'explorateur de fichiers
- Se rendre dans le dossier Documents
- Créer le dossier NSI s'il n'existe pas
- Dans le dossier NSI, créer le dossier chapitre_10
- Dans le dossier chapitre_10, créer le dossier tp1_manipulation_caracteres
🖥 Ordinateur fixe des salles informatiques
- Depuis le bureau, cliquer sur l'icône intitulée Zone personnelle
- Créer le dossier NSI s'il n'existe pas
- Dans le dossier NSI, créer le dossier chapitre_10
- 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 :
- Télécharger le fichier ZIP contenant les fichiers du TP : 📦 télécharger
- Ouvrir le fichier ZIP
- 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)
| Fichier | Type | Système | Encodage |
|---|---|---|---|
| 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 correspondC3 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')puisord('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.
- Ouvrir le fichier
partie4/main.py - Compléter la fonction
contruire_chaine - 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.
- Écrire la fonction
est_numeriquequi prend en paramètre une chaîne de caractèreschaineet qui renvoieTruesi elle ne contient que des chiffres,Falsesinon - Écrire la fonction
est_majusculequi prend en paramètre une chaîne de caractèrescne comportant qu'un seul caractère et qui renvoieTrues'il s'agit d'une majuscule ASCII,Falsesinon - Écrire la fonction
contient_majusculequi prend en paramètre une chaîne de caractèreschaineet qui renvoieTruesi elle contient une majuscule,Falsesinon - Écrire la fonction
convertir_minusculequi prend en paramètre une chaîne de caractèreschaineet qui renvoie la même chaîne entièrement en minuscules - Écrire la fonction
nettoyer_chainequi prend en paramètre une chaîne de caractèreschaineet 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
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)