Fichiers#

Ouvrir un fichier en lecture#

Fichiers « textes » et fichiers « binaires »#

Cela vous est peut-être déjà arrivé : Imaginons que vous ayez dans votre répertoire courant un code source python dans mon_script.py et un pdf dans cours.pdf.

Vous pourrez ouvrir mon_script.py dans un éditeur de texte, mais pas cours.pdf, ou alors ça affichera n’importe quoi.

En Python, on utilise la fonction native open(), en passant en argument le chemin du fichier.

Selon que l’on veuille accéder au texte dans le fichier ou aux données binaires qui sont à l’intérieur, on utilisera l’argument "r" ou "rb" (“r” comme “read”, et “b” comme “binary”)

Enfin, open() renvoie un « file-objet », qu’on note souvent “f”, qui contient une méthode read() pour lire le contenu du fichier.

En pratique, voici ce que cela donne :

f = open("mon_script.py", "r")
code = f.read()
print(code)
# affiche le code présent dans le fichier mon_script.py

f = open("cours.pdf", "rb")
données = f.read()
# données est mainteant une grosse suite
# d'octets

f = open("cours.pdf", "r")
f.read()
# Erreur: UnicodeDecodeError: 'utf-8' codec can't
# decode byte 0xd0 in position 10

Comme on doit utilisé l’option rb pour lire le pdf, on dit parfois que le fichier pdf est un fichier « binaire », par opposition avec mon_script.py qui est un fichier « texte ».

Ça n’a pas vraiment de sens : les deux fichiers sont stockés sur votre ordinateur comme des suites d’octets, indépendamment de leur contenu.

Il se trouve que l’un des deux contient une suite d’octets qui est décodable en tant que string. En fait, sous le capot, la suite d’octets renvoyée dans le premier example a été décodée avec l’encodage par défaut de votre système. On peut d’ailleurs passer l’encodage en argument à open() :

f = open("vieux_texte_en_latin_1.txt", "r", encoding="latin-1")
texte = f.read()

Ouvrir un fichier en écriture#

On peut aussi écrire dans un fichier, toujours avec open(), mais cette fois-ci avec la méthode write() du file-objet.

On peut écrire du texte avec l’option "w" et une chaîne de caractères :

f = open("mon_script.py", "w")
f.write("Nouveau contenu!")

Et écrire directement des données binaires avec "wb" et une suite d’octets

f = open("cours.pdf", "wb")
f.write(b"\x0c\x1f...")

Encore une fois, sous le capot, la chaîne de caractères sera encodée par Python avant d’être écrite dans le fichier texte.

Fermeture des file-objets#

Notez qu’il est impératif de fermer les fichiers que vous ouvrez, que ce soit en lecture ou en écriture, en appelant la méthode close() :

f = open("mon_poéme.py", "w")
f.write(premier_vers)
f.write(deuxième_vers)
f.close()

Conseils#

  • On utilise souvent le binaire pour échanger entre Python et le monde extérieur.

  • Tout texte a un encodage, et il vous faut connaître cet encodage pour travailler avec.

  • Si vous avez le choix, utilisez UTF-8.