Un fichier JSON utilisé comme un petit dictionnaire qui reste après la fermeture du programme : réglages, scores, liste d'utilisateurs, compteur de lancements… Une ligne pour écrire, une ligne pour relire, pas de open() ni de json.load() à écrire.
from simplesuit import json as sj
sj.put("theme", "sombre") # Écrire (crée data.json si besoin)
sj.put("volume", 70)
sj.get("theme") # "sombre"
sj.get("langue", "fr") # "fr" : la clé n'existe pas, valeur par défaut
sj.has("volume") # True
sj.delete("volume") # Supprimer une clé (True si elle existait)
sj.load() # Tout le fichier, en dict
sj.show() # Tout le fichier, joliment, en couleurs
résultat
# data.json
{
"theme": "sombre"
}
Chaque fonction relit le fichier et chaque écriture le sauvegarde tout de suite : si le programme plante ou que tu le fermes, rien n'est perdu.
Par défaut, data.json, à côté du script lancé, pas dans le dossier où tu te trouves dans le terminal. python3 ~/projets/jeu/main.py lancé depuis n'importe où utilise toujours ~/projets/jeu/data.json.
python
sj.set("users.json") # Change de fichier pour tous les appels suivants
sj.get_file() # Le chemin complet du fichier utilisé
sj.get("score", file="scores.json") # Un autre fichier juste pour cet appel
append(cle, valeur) ajoute à la liste d'une clé, et crée la liste si la clé n'existe pas encore. Il renvoie la liste complète.
python
sj.set("users.json")
sj.append("users", {"name": "Zoe", "age": 14})
users = sj.append("users", {"name": "Izac", "age": 15})
print(len(users), "utilisateurs")
for user in sj.get("users", []):
print(user["name"])
résultat
2 utilisateurs
Zoe
Izac
🪤append sur une clé qui n'est pas une liste
Si "users" contient déjà un dict ou un texte, append refuse avec TypeError: simplesuit.json : 'users' n'est pas une liste (dict), utilise put(). Dans le fichier, une liste s'écrit avec des crochets : "users": [ … ].
🪤put remplace, il n'ajoute pas
sj.put("user", nouveau)écrase l'ancienne valeur : il ne reste qu'un seul utilisateur. Pour en garder plusieurs, c'est append sur une liste.
sj.show() affiche le fichier avec des couleurs (clés en bleu, textes en vert, nombres en orange…) et un retour à la ligne par valeur. Il marche aussi avec n'importe quel dict ou liste :
python
sj.show() # Le fichier actuel
sj.show("users.json") # Un autre fichier
sj.show({"ok": True, "n": 3}) # Un dict (par exemple une réponse de capy)
texte = sj.pretty(sj.load()) # Le même texte, sans l'afficher
💡Pas de couleurs dans un fichier
Redirigé vers un fichier (python3 main.py > sortie.txt), show() enlève les couleurs tout seul. Pour les forcer ou les enlever : sj.show(colors=True) / sj.show(colors=False).
sj.get("score", 0) plutôt que sj.get("score") : au 1er lancement, la clé n'existe pas encore et tu évites un None qui fait planter + 1.
🪤Seulement des types JSON
Textes, nombres, True/False, None, listes et dicts. Un set, un tuple (relu comme une liste) ou une date ne survivent pas : convertis-les avant (list(...), date.isoformat()).
🪤Les clés deviennent du texte
En JSON, une clé est toujours un texte : sj.put("scores", {1: 50}) se relit {"1": 50}.
⚠️Pas pour plusieurs programmes en même temps
Si deux programmes (ou deux threads d'un serveur capy) écrivent le même fichier au même moment, l'un peut écraser l'autre. Pour un serveur, protège tes écritures avec un threading.Lock().
Et pour beaucoup de données ?
Chaque appel relit tout le fichier : c'est parfait jusqu'à quelques milliers d'éléments. Au-delà, ou pour des recherches compliquées, passe à sqlite3 (inclus dans Python).
Exemples
Sauvegarder des réglages
Un fichier JSON utilisé comme un petit dictionnaire qui reste après la fermeture du programme. Le fichier (data.json par défaut) est créé à côté du script lancé.
reglages.py
from simplesuit import json as sj
sj.put("theme", "sombre")
sj.put("volume", 70)
sj.put("favoris", ["capy", "simplesuit"])
print(sj.get("theme")) # sombreprint(sj.get("langue", default="fr")) # fr (la clé n'existe pas encore)print(sj.has("volume")) # Trueprint(sj.load()) # tout le fichier, en dict
sj.delete("volume")
print(sj.get_file()) # chemin du fichier utilisé
Compter les lancements
Le nombre augmente à chaque fois que tu relances le script.
compteur.py
from simplesuit import json as sj
lancements = sj.get("lancements", 0) + 1
sj.put("lancements", lancements)
print(f"Ce script a été lancé {lancements} fois")
Plusieurs fichiers
set() choisit le fichier pour toutes les fonctions ; file= pour un seul appel.
plusieurs_fichiers.py
from simplesuit import json as sj
sj.set("scores.json")
sj.put("alice", 120)
sj.put("bob", 95)
sj.put("derniere_partie", "2026-10-18", file="historique.json")
meilleur = max(sj.load(), key=sj.load().get)
print("Meilleur score :", meilleur) # aliceprint(sj.get("derniere_partie", file="historique.json"))
sj.clear() # Vide scores.json
Une liste qui grandit, et un bel affichage
append() ajoute à la liste d'une clé (et la crée si elle n'existe pas encore). show() affiche le fichier avec des couleurs et des retours à la ligne.
liste_et_affichage.py
from simplesuit import json as sj
sj.set("users.json")
sj.append("users", {"name": "Zoe", "age": 14, "id": 30})
sj.append("users", {"name": "Izac", "age": 15, "id": 31})
sj.show() # Tout le fichier, en couleurs
sj.show({"ok": True}) # Marche aussi avec un dict
texte = sj.pretty(sj.load()) # Le même texte coloré, sans l'afficher
defload(file=None) -> dict:
path = _path(file)
# Fichier absent ou vide -> dict vide au lieu de planterifnot path.exists() or path.read_text().strip() == "":
return {}
withopen(path, "r", encoding="utf-8") as f:
return json.load(f)
Afficher joliment le fichier (ou un dict / une liste) : couleurs + indentation
Exshow() / show("users.json") / show({"a": 1})
Sans couleurs si la sortie n'est pas un terminal (ex : python3 main.py > out.txt)
Voir le code
python
defshow(data=None, file=None, colors=None):
if colors isNone:
colors = sys.stdout.isatty()
if data isNoneorisinstance(data, (str, pth.Path)):
path = _path(data if data isnotNoneelse file)
print(_paint(f"# {path.name}", "punct", colors))
data = load(path)
print(pretty(data, colors))