Automatiser un transfert de données relançable
Tu reçois régulièrement un CSV de commandes. À chaque réception, tu dois contrôler la source, ne garder que les commandes livrées et produire un fichier pour l'analyse. Une copie manuelle peut laisser des lignes de la version précédente ou remplacer une sortie saine par un fichier incomplet.
Le script ne planifie aucun horaire : un traitement automatisé exécute les mêmes étapes sans manipulation intermédiaire ; une planification décide quand le lancer.
Les fichiers de l'expérience
Télécharge dans un même dossier :
commandes_source.csv, un extrait réel Olist ;commandes_source_invalide.csv, une copie volontairement altérée pour provoquer un échec ;lot_suivant.csv, un autre extrait réel pour le transfert ;transferer_commandes.py, le pipeline fourni.
Si un lien affiche le texte du fichier, fais un clic droit sur le lien puis
choisis « Enregistrer le lien sous… ». Garde le nom et son extension .csv ou
.py, sans ajouter .txt.
Le script utilise seulement Python 3.9 ou une version plus récente. Sous Windows, ouvre PowerShell dans ce
dossier. Si la commande py n'existe pas mais que python fonctionne, remplace
py par python dans la fiche.
Prédire la première sortie
Ouvre commandes_source.csv. Une ligne représente une commande. Le pipeline
doit vérifier l'en-tête, le nombre de champs de chaque enregistrement,
l'unicité de order_id et le format des dates, puis
conserver seulement les lignes dont order_status vaut delivered.
Avant de le lancer, écris :
- le nombre de lignes de la source ;
- le nombre attendu dans la sortie ;
- ce qui doit arriver au fichier de sortie si le contrôle échoue.
Lance ensuite :
py transferer_commandes.py commandes_source.csv commandes_livrees.csvLa sortie du terminal donne 15 lignes lues, 10 lignes écrites et une empreinte SHA-256. Une empreinte est un texte calculé à partir des octets d'un fichier : deux fichiers strictement identiques donnent la même empreinte.
Ouvre commandes_livrees.csv. Son en-tête ne contient plus que order_id et
date_achat, et ses onze lignes physiques sont l'en-tête plus dix commandes.
Le pipeline vient d'enchaîner lecture, contrôle, transformation et écriture dans
une seule commande.
Relancer sans doubler
Prédis ce qui arrivera au nombre de lignes et à l'empreinte si tu relances la même commande sans modifier la source. Puis relance-la.
Tu dois retrouver 10 lignes de données et la même empreinte. Le script réécrit la sortie complète à partir de la source complète. Il n'ajoute donc pas dix lignes aux dix précédentes.
Cette propriété s'appelle l'idempotence : relancer le même traitement avec la même entrée produit le même état final. Elle permet une reprise après une interruption sans fabriquer de doublons.
Faire échouer la source sans perdre la sortie
commandes_source_invalide.csv est une altération pédagogique : sa dernière
ligne reprend un order_id déjà utilisé. Avant l'exécution, note l'empreinte de
la dernière sortie saine affichée par le script.
Lance :
py transferer_commandes.py commandes_source_invalide.csv commandes_livrees.csvLe résultat attendu est ECHEC, avec l'identifiant répété. Le terminal affiche
aussi l'empreinte de la sortie restée en place : elle doit être celle notée
avant l'échec. Compare ces deux valeurs avant toute autre relance.
Une ligne trop courte ou trop longue est aussi refusée : le nombre de champs
doit correspondre aux trois colonnes de l'en-tête. Si ce message apparaît,
ouvre l'enregistrement indiqué et compare ses virgules et ses guillemets à
ceux de l'en-tête. Un champ vide n'est pas la même chose qu'un champ absent :
A,delivered, contient trois champs, dont une date vide ; A,delivered n'en
contient que deux. Les deux échouent, mais pas au même contrôle. Après la
correction, relance le traitement et vérifie son résultat.
Le contrôle se termine avant l'écriture. Le script prépare ensuite le nouveau
CSV dans un fichier temporaire, puis utilise os.replace pour remplacer la
destination en une opération. Ce remplacement atomique évite qu'un lecteur
voie la moitié de l'ancien fichier et la moitié du nouveau. Si la validation
échoue, cette étape n'est jamais atteinte.
Tu peux demander à ChatGPT de relire les fonctions lire_et_controler et
ecrire_atomiquement :
Donne le chemin exact suivi lors d'un doublon. Quelle instruction d'écriture n'est jamais atteinte ? Propose une expérience qui le prouve sans modifier le script.
Vérifie sa réponse avec l'empreinte avant et après l'échec. Une description du code ne remplace pas l'observation du fichier conservé.
Modification guidée : choisir une autre population
Dans transformer, remplace la condition :
if ligne["order_status"] == "delivered"par :
if ligne["order_status"] in {"delivered", "shipped"}Prédis la variation de l'effectif avant de relancer. Vérifie ensuite trois points : la sortie contient la commande expédiée, une seconde relance ne change pas l'empreinte, et la source invalide échoue encore sans écraser la sortie.
La modification change la population métier, pas les garanties de reprise. Ton compte rendu doit donc nommer la nouvelle population et garder les trois contrôles techniques.
Transfert autonome sur un lot inédit
lot_suivant.csv contient cinq commandes Olist qui ne figurent pas dans la
première source. Construis source_etendue.csv avec un seul en-tête et les
lignes des deux lots. Dans un éditeur de texte, conserve l'encodage UTF-8 et
les virgules comme séparateurs. Si l'en-tête apparaît comme une seule grande
colonne séparée par des points-virgules, corrige le séparateur avant de lancer
le pipeline. Ne modifie plus le script.
Avant l'exécution, prédis l'effectif source et la variation de l'effectif
destination. Lance le pipeline deux fois sur source_etendue.csv, puis provoque
un échec contrôlé en vidant un order_id dans une copie de cette source.
Ton transfert est vérifiable si tu rends :
- les commandes exactes des trois exécutions ;
- l'effectif source et l'effectif destination après les deux succès ;
- les deux empreintes identiques de la reprise ;
- l'erreur de la source altérée et l'empreinte inchangée de la dernière sortie saine ;
- une phrase qui distingue le traitement relançable de son éventuelle planification.
Si les deux lots portent le même identifiant, ne supprime pas une ligne au hasard. Arrête le transfert et établis avec la source s'il s'agit du même événement reçu deux fois ou de deux événements qui devraient avoir des clés différentes.