Aller au contenu

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.

  1. Copier le programme dans Thonny et l'exécuter.
  2. 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
  1. Copier la fonction lire_fichier dans Thonny.
  2. 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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞

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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞