<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Fichiers CSV</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Format CSV (Comma Separated Values), séparateurs (virgule,<br/>
point-virgule, tabulation), lecture et écriture avec le<br/>
module csv, en-tête, encodage UTF-8, conversion des<br/>
types, manipulations courantes.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q01 : Que signifie CSV ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie l'acronyme <strong>CSV</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le CSV est un standard très répandu pour les échanges<br/>
de données entre tableurs, bases de données et<br/>
programmes. Sa simplicité (texte brut, ligne par<br/>
ligne) en fait un format universel.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Comma Separated Values (valeurs séparées par des virgules)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est un format texte simple<br/>
dans lequel chaque ligne est un enregistrement<br/>
et les champs sont séparés par un délimiteur<br/>
(souvent une virgule, parfois un point-virgule<br/>
ou une tabulation).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Computer System Variables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport. C'est un format de<br/>
fichier de données tabulaires.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compressed Storage Vector</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : CSV n'est pas un format compressé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Centered Spreadsheet View</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas une vue de tableur, c'est<br/>
un format texte.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q02 : Structure d'un CSV</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la structure de base d'un fichier CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Exemple typique : la première ligne nom,age,ville<br/>
définit les colonnes ; les lignes suivantes<br/>
contiennent les valeurs correspondantes.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un fichier XML structuré par balises</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : CSV n'a pas de balises, juste des<br/>
séparateurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un format JSON imbriqué</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec JSON. CSV est plat.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un fichier texte où chaque ligne est un enregistrement et chaque champ est séparé par un délimiteur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la première ligne contient<br/>
souvent les noms des colonnes (en-tête), puis<br/>
chaque ligne suivante représente une entrée du<br/>
jeu de données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un fichier binaire avec en-tête et indexation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : CSV est un format <strong>texte</strong>, pas<br/>
binaire. Il s'ouvre avec n'importe quel éditeur<br/>
de texte.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q03 : Séparateur en France</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi en France utilise-t-on souvent le <strong>point-virgule</strong><br/>
; comme séparateur dans les fichiers CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>D'autres séparateurs sont possibles : tabulation<br/>
(TSV), barre verticale |, etc. Le module csv de<br/>
Python permet de spécifier le délimiteur via<br/>
delimiter=";".</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la norme ISO l'exige</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : CSV n'est pas strictement normé. Le<br/>
choix du séparateur dépend des conventions<br/>
locales.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les fichiers seraient sinon trop volumineux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport avec la taille.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que la virgule est utilisée comme séparateur décimal en français (par exemple 3,14), ce qui crée un conflit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 1,5;Paris est sans ambiguïté,<br/>
mais 1,5,Paris ne l'est pas (s'agit-il d'un<br/>
ou deux champs ?). Excel et LibreOffice en<br/>
version française utilisent donc ; par défaut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le point-virgule est plus rapide à taper</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas une raison de saisie.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q04 : Ligne d'en-tête</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>À quoi sert la <strong>première ligne</strong> d'un fichier CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'en-tête est une <strong>convention</strong>, pas une<br/>
obligation. Certains CSV n'en ont pas (par exemple<br/>
des exports machine sans description). Il faut alors<br/>
le savoir avant de lire le fichier.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle indique la taille du fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La taille d'un fichier<br/>
se mesure en octets et<br/>
se lit dans le système<br/>
de fichiers, pas dans<br/>
son contenu. L'en-tête<br/>
d'un CSV donne les noms<br/>
des colonnes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle contient toujours les données du premier enregistrement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : par convention, la première ligne<br/>
contient le plus souvent un <strong>en-tête</strong>, pas<br/>
des données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle est obligatoirement vide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : au contraire, elle contient<br/>
généralement les noms de colonnes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle contient les noms des colonnes (en-tête)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'usage le plus répandu.<br/>
Les programmes (et csv.DictReader) s'en<br/>
servent pour donner un nom à chaque champ.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q05 : Extension de fichier</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est l'extension habituelle d'un fichier CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'extension .csv est reconnue par Excel,<br/>
LibreOffice Calc, Google Sheets et la plupart des<br/>
langages de programmation, qui peuvent<br/>
automatiquement proposer un import.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>.json</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : JSON est un autre format de données<br/>
(hiérarchique).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>.txt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : techniquement possible (CSV est du<br/>
texte), mais l'extension conventionnelle est<br/>
différente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>.csv</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'extension standard,<br/>
reconnue par les tableurs et les outils de<br/>
traitement de données.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>.xlsx</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : .xlsx est le format propriétaire<br/>
d'Excel (binaire compressé), pas CSV.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q06 : Lecture sans le module csv</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sans utiliser le module csv, comment peut-on lire<br/>
un fichier CSV simple en Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cette approche a des limites : elle ne gère pas les<br/>
champs entre guillemets, les sauts de ligne dans<br/>
les champs, ou les caractères d'échappement. Pour<br/>
cela, mieux vaut le module csv.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec os.read()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une fonction bas niveau qui<br/>
retourne des octets bruts.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec print('csv')</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : print affiche, ne lit pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec open() puis .split(',') sur chaque ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on ouvre le fichier en lecture<br/>
et on parcourt ligne par ligne, en séparant<br/>
chaque ligne par le délimiteur. Cela marche<br/>
pour les CSV simples mais échoue avec les<br/>
champs contenant le délimiteur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec import json et json.load()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : json.load() lit du JSON, pas du CSV.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q07 : Module standard</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel module de la bibliothèque standard de Python<br/>
facilite la manipulation des fichiers CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le module csv fait partie de la bibliothèque<br/>
standard (livré avec Python). Aucune installation<br/>
n'est nécessaire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>csv</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : import csv donne accès aux<br/>
fonctions csv.reader, csv.writer,<br/>
csv.DictReader, csv.DictWriter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>pandas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>pandas est très utilisé pour les CSV mais<br/>
c'est une bibliothèque externe (pas standard).<br/>
Il faut l'installer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>numpy</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>numpy peut lire des CSV via genfromtxt,<br/>
mais ce n'est pas son rôle principal et c'est<br/>
également externe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>xml.etree</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce module sert pour les fichiers XML.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q08 : Encodage recommandé</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel <strong>encodage</strong> est aujourd'hui recommandé pour les<br/>
fichiers CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En Python, on précise l'encodage à l'ouverture :<br/>
open("data.csv", encoding="utf-8"). Si on omet<br/>
cet argument, Python utilise l'encodage par défaut<br/>
du système, ce qui peut poser problème entre<br/>
Windows et Linux.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>ISO-8859-1 uniquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Encodage ancien (Latin-1), encore courant en<br/>
Europe mais limité à 256 caractères. À éviter<br/>
pour de nouveaux projets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Binaire compressé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un CSV est du texte, pas du binaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>UTF-8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : UTF-8 supporte tous les<br/>
caractères Unicode (français, chinois, emojis...).<br/>
C'est l'encodage standard moderne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>ASCII pur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ASCII ne couvre pas les caractères<br/>
accentués (é, à, ç...), inutilisables en<br/>
français.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q09 : Itération avec csv.reader</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie csv.reader(f) lorsqu'on l'utilise dans<br/>
une boucle for ligne in csv.reader(f): ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Penser à convertir les valeurs numériques avec<br/>
int() ou float() avant tout calcul. CSV est<br/>
texte : "17" + 1 ne fonctionnera pas.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un dictionnaire {nom_colonne: valeur}</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est ce que renvoie csv.DictReader,<br/>
pas csv.reader.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une chaîne de caractères pour chaque ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour avoir une chaîne, il suffirait<br/>
de boucler directement sur le fichier f.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un tuple immuable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une liste mutable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une liste des champs de chaque ligne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : chaque itération produit une<br/>
liste comme ["Alice", "17", "Lyon"]. Tous les<br/>
éléments sont des chaînes (il faut convertir<br/>
si l'on veut des entiers).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q10 : Écrire dans un CSV</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle fonction du module csv permet d'<strong>écrire</strong><br/>
dans un fichier CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma typique :<br/>
with open("out.csv", "w", newline="", encoding="utf-8") as f:<br/>
    w = csv.writer(f) ; w.writerow(["a", "b"]).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>csv.save()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette fonction n'existe pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>csv.put()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette fonction n'existe pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>csv.writer()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on l'utilise avec un fichier<br/>
ouvert en écriture ("w"), puis sa méthode<br/>
.writerow() ou .writerows() ajoute les<br/>
lignes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>csv.write()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette fonction n'existe pas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q11 : Différence reader / DictReader</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre csv.reader et<br/>
csv.DictReader ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>DictReader est généralement préférable quand le<br/>
fichier a un en-tête : le code est plus auto-documenté<br/>
(ligne["age"] plutôt que ligne[2]).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>DictReader lit plus vite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la performance n'est pas la<br/>
différence essentielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>reader n'existe pas en Python 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il existe parfaitement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>reader produit des listes, DictReader produit des dictionnaires indexés par les noms de colonnes (lus depuis l'en-tête)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : DictReader consomme la<br/>
première ligne comme en-tête et permet<br/>
ensuite d'écrire ligne["nom"] au lieu de<br/>
ligne[0]. Plus lisible et robuste si l'ordre<br/>
des colonnes change.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>DictReader ignore l'en-tête</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse, il <strong>utilise</strong><br/>
l'en-tête pour nommer les colonnes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q12 : Conversion de types</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Après lecture, on obtient ligne = ["Alice", "17"].<br/>
Comment obtenir un âge utilisable comme nombre ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toujours convertir explicitement : int(),<br/>
float(), bool() selon le besoin. Penser aussi<br/>
au cas où la cellule est vide (chaîne ""), qui<br/>
provoquerait ValueError avec int().</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>age = int(ligne[1])</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : int() convertit la chaîne<br/>
"17" en entier 17, utilisable dans des<br/>
calculs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>age = list(ligne[1])</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : list("17") donne ['1', '7'], pas<br/>
un entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>age = ligne[1].number()</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode .number() n'existe pas<br/>
sur les chaînes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>age = ligne[1]</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : age reste une <strong>chaîne</strong>. Faire<br/>
age + 1 lèverait TypeError.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q13 : Spécifier le séparateur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment lire un CSV utilisant le <strong>point-virgule</strong><br/>
comme séparateur avec le module csv ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour les fichiers exportés par Excel français, le<br/>
séparateur est ;. Pour les CSV anglo-saxons ou<br/>
Google Sheets, c'est ,. Pour TSV (tab-separated),<br/>
c'est '\t'.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>csv.reader(f).set_separator(';')</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette méthode n'existe pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>csv.reader(f, delimiter=';')</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on précise le délimiteur via<br/>
l'argument nommé delimiter.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>csv.reader_semicolon(f)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cette fonction n'existe pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>csv.reader(f) (suffisant, le module détecte tout seul)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : par défaut, le séparateur est la<br/>
virgule. Le module ne devine pas (il existe<br/>
csv.Sniffer mais ce n'est pas automatique).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q14 : Champs contenant le séparateur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment représente-t-on un champ contenant le<br/>
caractère séparateur (par exemple une virgule) dans<br/>
un CSV à séparateur virgule ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Et pour un guillemet à l'intérieur d'un champ<br/>
« guillemeté » ? On le double : "il dit ""bonjour""".</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On échappe la virgule avec un antislash \,</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas la convention CSV<br/>
standard (qui utilise les guillemets).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On supprime la virgule du champ</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on perdrait l'information.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On change le séparateur pour ce champ uniquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un fichier CSV utilise un séparateur<br/>
unique pour tout le fichier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On entoure le champ de guillemets doubles : "Lyon, France"</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la convention RFC 4180.<br/>
Le module csv gère cette syntaxe<br/>
automatiquement (lecture comme écriture).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q15 : Trace de lecture</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le fichier eleves.csv contient :<br/>
`<code><br/>
nom;age<br/>
Alice;17<br/>
Bob;16<br/>
</code><br/>
Que vaut ligne au premier passage de la boucle<br/>
for ligne in csv.DictReader(open("eleves.csv"), delimiter=";")` ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour récupérer toutes les lignes d'un coup :<br/>
lignes = list(csv.DictReader(...)).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>['Alice', '17']</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le retour de csv.reader,<br/>
pas de csv.DictReader.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>['nom', 'age']</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : DictReader consomme la première<br/>
ligne comme en-tête, elle n'apparaît pas dans<br/>
la boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>{'nom': 'Alice', 'age': '17'}</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : DictReader saute l'en-tête<br/>
et associe chaque valeur à son nom de colonne.<br/>
Noter que '17' reste une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>{'Alice': '17', 'Bob': '16'}</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne reçoit qu'une ligne à chaque<br/>
itération, pas tout le fichier.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q16 : Filtrer les données</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Comment afficher seulement les élèves de plus de<br/>
16 ans à partir d'un CSV nom,age lu via<br/>
csv.DictReader ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toujours convertir avant de comparer<br/>
numériquement. Pour des manipulations plus<br/>
complexes, pandas est plus pratique mais c'est<br/>
hors programme.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for ligne in lecteur:<br/>
    print(ligne["nom"]) if ligne["age"] &gt; 16<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe Python invalide (le if<br/>
ternaire requiert un else) <strong>et</strong> problème<br/>
de type.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
lecteur.filter(age &gt; 16)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode .filter() n'existe pas<br/>
sur csv.DictReader. C'est une syntaxe d'un<br/>
autre langage (SQL ?).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for ligne in lecteur:<br/>
    if ligne["age"] &gt; 16:<br/>
        print(ligne["nom"])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ligne["age"] est une <strong>chaîne</strong><br/>
("17"). En Python 3, comparer une chaîne et<br/>
un entier lève TypeError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
for ligne in lecteur:<br/>
    if int(ligne["age"]) &gt; 16:<br/>
        print(ligne["nom"])<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on convertit l'âge en entier<br/>
(sinon "17" &gt; 16 est invalide en Python 3),<br/>
on filtre, on affiche le nom.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q17 : Argument newline=''</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi écrit-on souvent<br/>
open("data.csv", "w", newline="", encoding="utf-8")<br/>
pour écrire un CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Petit détail technique mais essentiel pour la<br/>
portabilité Linux/macOS/Windows. À ajouter<br/>
systématiquement quand on utilise csv.writer.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour ajouter une ligne d'en-tête automatiquement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : newline="" n'a aucun effet sur<br/>
l'en-tête. Il faut écrire l'en-tête<br/>
explicitement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour rendre le fichier illisible par les humains</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un CSV reste un fichier texte<br/>
parfaitement lisible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour éviter d'insérer des lignes vides entre chaque enregistrement sous Windows (problème classique de gestion des fins de ligne)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sans newline="", Python<br/>
réécrit \n → \r\n sur Windows, et le<br/>
module csv ajoute lui-même un \r\n,<br/>
provoquant des doubles sauts. La solution<br/>
recommandée par la doc est newline="".</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour augmenter les performances</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas une question de<br/>
performance.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q18 : Valeurs manquantes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans un CSV avec nom,age,ville et la ligne<br/>
Alice,,Lyon, que vaut ligne["age"] après lecture<br/>
par csv.DictReader ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Donnée manquante : penser à filtrer ou utiliser<br/>
une valeur par défaut, par exemple<br/>
int(ligne["age"]) if ligne["age"] else None.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le programme lève une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la lecture se passe sans erreur ;<br/>
c'est seulement la conversion ultérieure<br/>
(int("")) qui lèverait ValueError.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le module ne fait aucune supposition.<br/>
Une absence n'est pas un zéro.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>None</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : csv.DictReader ne convertit pas<br/>
automatiquement les vides en None.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>'' (chaîne vide)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : un champ vide entre deux<br/>
séparateurs est lu comme une chaîne vide. Il<br/>
faut le tester explicitement avant toute<br/>
conversion : if ligne["age"] != "":.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q19 : Export depuis tableur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle situation correspond à un cas d'usage typique<br/>
du format CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Force du CSV : universalité. Faiblesses : pas de<br/>
types (tout est texte), pas de hiérarchie, pas de<br/>
schéma standard (séparateur, encodage variables).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Échanger un tableau de notes entre Pronote, un tableur et un script Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est exactement le rôle du<br/>
CSV, un format pivot universel pour les<br/>
données tabulaires, lisible par tous les<br/>
outils.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Stocker une vidéo HD</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : CSV est un format texte, inadapté à<br/>
la vidéo (binaire compressé).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Construire une page web interactive</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le rôle du HTML/CSS/JS.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Programmer un microcontrôleur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on programme en C, Python, etc., pas<br/>
en CSV.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q20 : CSV vs JSON</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour stocker une <strong>liste plate de personnes</strong><br/>
(nom, âge, ville), CSV ou JSON ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle pratique : <strong>plat et tabulaire → CSV</strong> ;<br/>
<strong>hiérarchique → JSON</strong> ; <strong>gros volumes ou<br/>
requêtes complexes → SGBD</strong>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>JSON est obligatoire dès qu'on programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune obligation. Chaque format a<br/>
ses cas d'usage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>CSV est le plus adapté car les données sont tabulaires et plates</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour des données strictement<br/>
tabulaires, CSV est plus compact et plus<br/>
rapide à parser. JSON brille pour les<br/>
structures hiérarchiques (données imbriquées,<br/>
listes de listes).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, il faut une base de données</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Exagéré : pour quelques centaines de lignes,<br/>
un fichier CSV est largement suffisant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>XML est toujours le bon choix</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : XML est verbeux pour des données<br/>
plates ; on lui préfère CSV ou JSON.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q21 : Bug d'encodage</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un élève lit un CSV créé sous Windows et obtient<br/>
Café au lieu de Café. Quelle est la cause la<br/>
plus probable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Indice révélateur : é = Ã© est la <strong>signature<br/>
classique</strong> d'une mauvaise interprétation d'UTF-8<br/>
en Latin-1. Il existe d'autres signatures<br/>
(’ au lieu de ’) qui pointent vers le même<br/>
problème.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Python est trop ancien pour gérer l'UTF-8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python 3 gère parfaitement UTF-8<br/>
depuis sa sortie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le fichier est corrompu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le contenu est correct, c'est<br/>
l'<strong>interprétation</strong> de l'encodage qui pose<br/>
problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le fichier est encodé en UTF-8 mais lu comme du Latin-1 (ISO-8859-1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : é en UTF-8 = 0xC3 0xA9. Lu<br/>
comme Latin-1, ces deux octets donnent Ã©.<br/>
Solution : préciser encoding="utf-8" à<br/>
l'ouverture.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La connexion internet est instable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun rapport, on lit un fichier<br/>
local.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q22 : Parsing à la main</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi ligne.split(',') est-il <strong>insuffisant</strong><br/>
pour parser correctement la ligne CSV<br/>
"Doe, John",42,"Lyon, France" ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Leçon : pour tout CSV non trivial (guillemets,<br/>
sauts de ligne dans les champs, échappements),<br/>
utiliser le module csv. Le « parsing manuel »<br/>
n'est correct que pour des cas très simples et<br/>
maîtrisés.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>split ne fonctionne que sur des fichiers UTF-8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : split est indépendant de l'encodage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>split modifie le fichier d'origine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : split ne modifie rien, il renvoie<br/>
une nouvelle liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>split ne respecte pas les guillemets et coupe à chaque virgule, donnant 5 champs au lieu de 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : split(',') produit ['\"Doe',<br/>
' John\"', '42', '\"Lyon', ' France\"']. Le<br/>
module csv gère correctement ce cas en<br/>
regroupant les champs entourés de guillemets.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>split est trop lent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la performance n'est pas le<br/>
problème, la <strong>correction</strong> l'est.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q23 : Calcul d'une moyenne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le fichier notes.csv contient une colonne note<br/>
(entête en première ligne) avec des nombres entiers.<br/>
Quel code calcule correctement la <strong>moyenne</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois étapes systématiques : ouvrir, convertir<br/>
les types, calculer. Toujours penser à la<br/>
conversion en numérique avant tout calcul.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
moyenne = csv.mean("notes.csv", "note")<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction csv.mean n'existe pas.<br/>
Le module csv se limite à la lecture/écriture.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
with open("notes.csv") as f:<br/>
    moyenne = sum(csv.reader(f)) / 2<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sum ne sait pas additionner des<br/>
listes de chaînes ; et la division par 2 est<br/>
arbitraire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
with open("notes.csv") as f:<br/>
    total = 0<br/>
    for ligne in csv.DictReader(f):<br/>
        total += ligne["note"]<br/>
    moyenne = total / len(lignes)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ligne["note"] est une <strong>chaîne</strong>.<br/>
total += "12" lève TypeError. De plus<br/>
lignes n'est pas défini.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
with open("notes.csv") as f:<br/>
    notes = [int(ligne["note"]) for ligne in csv.DictReader(f)]<br/>
moyenne = sum(notes) / len(notes)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on construit une liste<br/>
d'entiers (conversion explicite avec int),<br/>
puis sum / len. Code concis et correct.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q24 : Écrire avec en-tête</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code écrit correctement un CSV avec en-tête à<br/>
partir d'une liste de tuples<br/>
donnees = [("Alice", 17), ("Bob", 16)] ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique systématique : with open(...,<br/>
newline="", encoding="utf-8") + csv.writer +<br/>
writerow (en-tête) + writerows (données).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
csv.write("out.csv", donnees)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction csv.write n'existe<br/>
pas. Il faut un objet writer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
with open("out.csv", "w") as f:<br/>
    f.write(donnees)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : write attend une <strong>chaîne</strong>, pas<br/>
une liste de tuples.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
with open("out.csv", "w") as f:<br/>
    for nom, age in donnees:<br/>
        f.write(nom + "," + age + "\n")<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : age est un entier, on ne peut pas<br/>
le concaténer à une chaîne avec + (TypeError).<br/>
Et l'en-tête est absent. Et newline=""<br/>
manquant pour un usage portable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>`<code>python<br/>
with open("out.csv", "w", newline="", encoding="utf-8") as f:<br/>
    w = csv.writer(f)<br/>
    w.writerow(["nom", "age"])<br/>
    w.writerows(donnees)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : writerow pour l'en-tête,<br/>
writerows (avec s) pour la liste de tuples<br/>
; newline="" pour la portabilité ;<br/>
encoding="utf-8" pour les accents. Code<br/>
idiomatique et robuste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Fichiers CSV — Q25 : Limite du CSV</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur le format CSV,<br/>
laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Limites du CSV : pas de typage, pas de hiérarchie,<br/>
séparateur variable, encodage variable. Pour des<br/>
données complexes ou critiques, on lui préfère<br/>
JSON, Parquet, ou une vraie base de données.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>CSV impose une typage explicite des colonnes (entier, flottant, date)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : tout est traité<br/>
comme du <strong>texte</strong> dans un CSV. Aucun type<br/>
n'est conservé. C'est au programme de lecture<br/>
de convertir explicitement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>CSV ne gère pas nativement les structures hiérarchiques (listes imbriquées, dictionnaires)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est sa principale limite par rapport<br/>
à JSON ou XML.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>CSV est un format texte, lisible avec n'importe quel éditeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est l'un de ses grands avantages.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le séparateur n'est pas standardisé universellement (virgule, point-virgule, tabulation...)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est une faiblesse historique du<br/>
format. La RFC 4180 propose la virgule mais<br/>
n'est pas suivie partout.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
