ce mini-projet combine HTTP, JSON et fichiers : vous appelez une API, transformez les données et enregistrez un résultat.
objectifs
- envoyer une requête GET avec
requests - gérer les erreurs réseau/HTTP
- transformer et sauvegarder les données
explication détaillée
exemple d’API : https://jsonplaceholder.typicode.com/posts (fictive pour démo).
vous allez récupérer une liste d’objets, ne garder que certaines colonnes, et écrire posts.csv.
exemples exécutables
import requests, csv
URL = "https://jsonplaceholder.typicode.com/posts"
def fetch(url: str, timeout: float = 10.0):
r = requests.get(url, timeout=timeout)
r.raise_for_status()
return r.json()
def transform(rows):
# garder id, userId, title (premiers 60 chars)
out = []
for r in rows:
out.append({
"id": r.get("id"),
"user_id": r.get("userId"),
"title": (r.get("title") or "").strip()[:60],
})
return out
def save_csv(rows, path: str):
with open(path, "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=["id", "user_id", "title"])
w.writeheader()
w.writerows(rows)
def main():
try:
rows = fetch(URL)
except requests.RequestException as e:
print("erreur réseau/http:", e)
return
cleaned = transform(rows)
save_csv(cleaned, "posts.csv")
print("ok:", len(cleaned), "lignes")
if __name__ == "__main__":
main()
bonnes pratiques
- toujours définir
timeout= - vérifier le schéma minimal attendu et ignorer les champs absents
- logguer les erreurs et retourner un code ≠ 0 si c’est un outil CLI
pièges courants
- se fier au format sans le valider
- ne pas traiter les erreurs 4xx/5xx
exercices
- ajouter un argument
--limit Npour ne garder que N éléments. - écrire aussi un fichier
posts.jsonavecensure_ascii=Falseetindent=2. - normaliser les titres (
titlecase) et filtrer ceux vides.