Aller au contenu
M03 · C. Coder des solutions orientées objet

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
MÉMOIREDISQUE Livre"L001"45 DH, stock 3 {"code": "L001", "prix": 45, "stock": 3} stock.jsontexte json.dump() dictionnaire json.load() Livre"L001"45 DH, stock 3

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ÉcritureQuand 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.

  1. L’objet devient un dictionnaire : vers_dict().
  2. Le dictionnaire devient du texte JSON : json.dump(...).
  3. 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.

texte = json.dumps(livre.vers_dict())      # emballer
livre = Livre.depuis_dict(json.loads(texte))   # déballer

3Manipuler

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.
Pas à pas dans le lab ↗Python se charge au premier clic (environ 12 Mo, une seule fois).
Console
Mémoire : objets créés

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
with open("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)

5Vérifier

1. Quelle collection choisir pour retrouver vite un livre par son code ?
2. Pourquoi écrire une méthode vers_dict() avant d'enregistrer en JSON ?
3. Que fait sorted(livres, key=lambda l: l.prix) ?