Manipuler les données : collections d'objets et fichiers
Ranger des objets dans des listes et des dictionnaires, les trier et les filtrer, puis les enregistrer dans un fichier JSON et les recharger.
1Situer
Une petite librairie de Rabat a une centaine de livres dans son application. Le libraire veut chercher un livre par son code, voir les livres en rupture de stock, trier par prix, et surtout retrouver son stock le lendemain. Les objets disparaissent quand le programme s'arrête : il faut donc les enregistrer dans un fichier et savoir les relire.
2Comprendre
Enregistrer des objets dans un fichier JSON, puis les relire
Un objet Livre vit en mémoire. Quand le programme s'arrête, il disparaît.
1 / 5
Une application manipule rarement un seul objet : elle en gère des dizaines, rangés dans des collections, et doit les conserver entre deux exécutions.
Les collections d’objets
Collection
Écriture
Quand l’utiliser
liste
[l1, l2]
ordre important, parcours complet
dictionnaire
{"L001": l1}
accès rapide par une clé
ensemble
{l1, l2}
éviter les doublons
tuple
(l1, l2)
collection fixe
Les compréhensions rendent les traitements courts :
rupture = [l for l in livres if l.stock ==0]
par_code = {l.code: l for l in livres}
Pour trier des objets, on indique le critère avec key : sorted(livres, key=lambda l: l.prix).
Enregistrer des objets dans un fichier
Un objet n’existe qu’en mémoire. Pour le garder, on le sérialise : on le transforme en texte. Le format le plus courant est JSON, lisible par tous les langages.
L’objet devient un dictionnaire : vers_dict().
Le dictionnaire devient du texte JSON : json.dump(...).
Au retour, le texte redevient un dictionnaire (json.load), puis un objet (Livre.depuis_dict).
Les fichiers en Python
On ouvre toujours un fichier avec with open(...) : il est fermé automatiquement. Les modes : "r" lire, "w" écrire (écrase), "a" ajouter. Pensez à encoding="utf-8" pour les accents.
Exemple simple
Le classeur et ses intercalaires
Une liste, c'est une pile de fiches dans l'ordre. Un dictionnaire, c'est un classeur avec des intercalaires A, B, C : on va directement à la bonne fiche grâce à sa clé.
livres = [l1, l2, l3] # liste : parcours dans l'ordre
par_code = {"L001": l1, "L002": l2} # dict : accès direct par la cléprint(par_code["L002"].titre)
Exemple simple
Mettre en carton avant de déménager
On ne peut pas envoyer un meuble monté par la poste : on le démonte, on l'emballe, et on le remonte à l'arrivée. Enregistrer un objet, c'est le transformer en texte (JSON) ; le relire, c'est reconstruire l'objet.
Exécutez : le stock est enregistré dans stock.json puis rechargé dans de nouveaux objets. Ajoutez un livre, changez le seuil de rupture, ou triez par titre au lieu du prix.
Exécutez le code : les objets et leurs attributs s'afficheront ici.
4Pratiquer
Exercice 1 · Valeur du stock
Calculez la valeur totale du stock (prix × stock pour chaque livre) en une ligne.
Voir le corrigé
valeur =sum(l.prix * l.stock for l in livres)
print(valeur, "DH")
Exercice 2 · Exporter en CSV
Enregistrez les livres dans un fichier livres.csv avec le module csv (une ligne d'en-tête puis une ligne par livre).
Voir le corrigé
import csv
withopen("livres.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["code", "titre", "prix", "stock"])
for l in livres:
w.writerow([l.code, l.titre, l.prix, l.stock])
Exercice 3 · Regrouper par catégorie
Chaque livre a maintenant un attribut categorie. Construisez un dictionnaire {categorie: [livres]}.
Voir un indice
dict.setdefault(cle, []) renvoie la liste existante ou en crée une vide.
Voir le corrigé
par_categorie = {}
for l in livres:
par_categorie.setdefault(l.categorie, []).append(l)