Conversion de fichiers⚓︎
Ouvrir un fichier
Il se peut qu'à l'ouverture d'un fichier, les caractères ne s'affichent pas tous de façon correcte. C'est parce que l'encodage du fichier n'est pas reconnu ou n'est pas le bon. Vous pouvez comparer cette page et celle-ci.
Pour régler cela, nous allons faire une fonction permettant de changer l'encodage d'un fichier.
La fonction open
permet d'ouvrir un fichier pour le lire ou y écrire dedans. Elle prend deux paramètres. Le premier est le nom du fichier (en incluant le chemin pour l'atteindre). Le deuxième est action
qui peut être soit "r"
pour lire, soit "w"
pour écrire. Il est également possible de rajouter un paramètre pour préciser l'encodage.
Exercice 5
La fonction creation_fichier_utf8
crée un fichier, écrit du texte dedans et l'enregistre avec un encodage UTF8
.
def creation_fichier_utf8():
with open("fichier_en_utf8.txt", "w", encoding="utf8") as fichier:
fichier.write("Ce fichier est enregistré en utf8.\n")
fichier.write("Si tout se passe bien, il ne devrait pas y avoir")
fichier.write(" de caractères bizarres.\n")
fichier.write("Même si on fait : éÉèÈàÀùÙ.\n")
Normalement, il faut fermer le fichier à la fin de son utilisation, mais l'utilisation du with
permet de le faire automatiquement une fois qu'on est sorti du bloc correspondant.
- Copier le programme dans Thonny et l'exécuter.
- Ouvrir le fichier avec
Notepad++
, vérifier le contenu et l'encodage qui est indiqué en bas de la fenêtre.
Exercice 6
Écrire une fonction creation_fichier_latin1
qui fait la même chose mais avec un encodage "latin1"
et qui crée un fichier fichier_en_latin1.txt
.
Ouvrir et lire un fichier
On va maintenant faire une fonction permettant d'ouvrir un fichier avec un encodage donné et qui va l'afficher en intégralité.
def lire_fichier(nom, encodage="utf8"):
with open(nom, "r", encoding = encodage) as fichier:
print(fichier.read())
Par défaut, l'encodage sera l'UTF-8 si aucun encodage n'est donné.
Exercice 7
- Copier la fonction
lire_fichier
dans Thonny. - Ouvrir les 2 fichiers générés dans les exercices précédents avec le bon et avec le mauvais encodage.
Lire un fichier ligne par ligne
Dans les exercices précédents, les fichiers sont ouverts d'un seul coup. Il est également possible de les ouvrir ligne par ligne.
def lire_fichier_par_ligne(nom, encodage="UTF-8"):
with open(nom, "r", encoding = encodage) as fichier:
for ligne in fichier.readlines():
print(ligne)
Si vous testez cette fonction, vous remarquerez qu'une ligne est ajoutée entre chaque ligne. C'est parce que le dernier caractère de chaque ligne du fichier est un retour à la ligne et qu'il rajoute donc une ligne en plus à l'affichage. Pour l'enlever, il suffit d'utiliser print(ligne.strip())
.
Exercice 8
Écrire une fonction points_de_code_fichier
qui prend en paramètres un texte, nom
, et un autre encodage
et qui affiche ligne par ligne la liste des points de code du fichier ouvert avec l'encodage donné. Comparer les résultats obtenus avec fichier_en_utf8.txt
en UTF-8 et en latin-1 ainsi que fichier_en_latin1.txt
en latin-1.
Vous pouvez utiliser la fonction decodage
vue à l'exercice 1.
Exercice 9
Écrire une fonction conversion_fichier
qui prend en paramètres 4 chaînes de caractères nom1
, nom2
, encodage1
et encodage2
et qui ouvre le fichier nom1
avec l'encodage encodage1
puis le copie dans un fichier nom2
avec l'encodage encodage2
.
Il faut mieux ouvrir le premier fichier, enregistrer le résultat de fichier1.read()
puis ouvrir le deuxième fichier et y écrire le contenu obtenu.
Et les autres encodages ?
Python connait bien sûr bien plus d'encodages que ASCII, latin-1 et UTF-8. Il est possible d'obtenir la liste de ces encodages en faisant :
>>> import encodings
>>> print(sorted(set(encodings.aliases.aliases.values())))
# à vous de trouver le résultat
On obtient ainsi la liste triée des encodages reconnus, en supprimant les doublons (comme "uft8"
et "utf-8"
).
Exercice 10
Trouver le nombre d'encodages disponibles.
Exercice 11
Il est possible d'afficher les descriptions des différents caractères unicodes. Pour cela, il faut d'abord rajouter from unicodedata import name
au début de votre script Python pour obtenir le nom d'un symbole.
Utiliser la fonction suivante qui prend en paramètre deux entiers debut
et fin
et qui affiche les informations des caractères dont le point de code est compris entre debut
et fin
, et la tester sur différentes plages de caractères.
# Tests
(insensible à la casse)(Ctrl+I)
# Tests
(insensible à la casse)(Ctrl+I)