Fichiers, exceptions et JSON
Ce que tu vas apprendre
- Lire et écrire un fichier texte sans risquer de le laisser ouvert.
- Intercepter une erreur avec
tryetexceptau lieu de planter. - Enregistrer et recharger un dictionnaire au format JSON.
Écrire un fichier
On ouvre un fichier avec open(). Le mot-clé with garantit qu'il est refermé à la fin du bloc, même en cas d'erreur.
with open("courses.txt", "w", encoding="utf-8") as f:
f.write("farine\n")
f.write("oeufs\n")
Le deuxième argument est le mode : "w" écrit en effaçant le contenu existant, "a" ajoute à la fin, "r" lit. Le mode par défaut est la lecture.
encoding="utf-8" évite les problèmes avec les accents. Le \n marque un retour à la ligne.
Lire un fichier
with open("courses.txt", "r", encoding="utf-8") as f:
for ligne in f:
print(ligne.strip())
Le fichier se parcourt ligne par ligne avec for. strip() retire le retour à la ligne de fin. Pour tout récupérer d'un coup, f.read() renvoie un seul texte.
"courses.txt" est relatif au dossier d'où tu lances python, pas à celui du script. Le module pathlib offre une manière plus sûre de construire des chemins.Les exceptions
Quand quelque chose échoue, Python lève une exception et arrête le programme. Essaie de lire un fichier absent :
open("inconnu.txt")
Python s'arrête avec une erreur FileNotFoundError. Le nom de l'exception dit ce qui s'est passé : lis toujours la dernière ligne du message.
try et except
Un bloc try tente une action, et except réagit si une exception précise survient.
try:
with open("recettes.txt", encoding="utf-8") as f:
contenu = f.read()
except FileNotFoundError:
print("Le fichier n'existe pas encore")
contenu = ""
Le programme continue au lieu de planter. Nomme toujours l'exception attendue : un except: seul masquerait aussi tes vraies erreurs.
Saisie invalide
Reprenons le int(input()) du premier cours. Une saisie incorrecte lève une ValueError.
try:
portions = int(input("Portions ? "))
except ValueError:
print("Entre un nombre entier")
portions = 4
Quelques exceptions courantes :
| Exception | Cause typique |
|---|---|
ValueError | Valeur du bon type mais inutilisable (int("abc")). |
TypeError | Opération sur un mauvais type ("a" + 1). |
KeyError | Clé absente d'un dictionnaire. |
IndexError | Indice hors de la liste. |
FileNotFoundError | Fichier introuvable. |
else, finally et raise
Deux clauses facultatives complètent try. else s'exécute si aucune exception n'a eu lieu, finally s'exécute dans tous les cas.
try:
portions = int("4")
except ValueError:
print("Invalide")
else:
print("Conversion réussie")
finally:
print("Terminé")
Pour signaler toi-même une erreur, utilise raise :
def diviser_recette(portions):
if portions <= 0:
raise ValueError("Il faut au moins une portion")
return 1 / portions
Sauvegarder en JSON
Le JSON est un format texte pour échanger des données, très répandu sur le web. Le module json convertit un dictionnaire en JSON et inversement.
import json
recette = {"nom": "Crêpes", "portions": 4}
with open("recette.json", "w", encoding="utf-8") as f:
json.dump(recette, f, ensure_ascii=False, indent=2)
with open("recette.json", encoding="utf-8") as f:
relue = json.load(f)
print(relue["nom"])
json.dump écrit, json.load lit. indent=2 rend le fichier lisible et ensure_ascii=False garde les accents tels quels. Le programme affiche « Crêpes ».
À retenir
with open(chemin, mode, encoding="utf-8") as f:ouvre un fichier et le referme tout seul.- Les modes courants sont
"r"(lire),"w"(écrire en effaçant) et"a"(ajouter). trytente une action,except NomErreurla rattrape ; nomme toujours l'exception.elsesuit untryréussi,finallys'exécute dans tous les cas,raiselève une erreur.json.dumpetjson.loadsauvegardent et rechargent un dictionnaire.
Pour aller plus loin
Sources officielles
Ensuite
Listes, dictionnaires et tuples
Regrouper des valeurs avec les listes, les dictionnaires et les tuples, puis les transformer avec les compréhensions.
Classes, annotations et environnements virtuels
Modéliser des objets avec les classes, documenter les types avec les annotations, et isoler chaque projet avec venv et pip.
- Projet
- Lignes de code
- Niveau
- Le quartier
- Appartement
- Python
- Pièce
- 5/7
- Plan n°
- python/05.fichiers-et-exceptions