<?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 <code>csv</code>, 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 <code>nom,age,ville</code><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/>
<code>;</code> 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 <code>|</code>, etc. Le module <code>csv</code> de<br/>
Python permet de spécifier le délimiteur via<br/>
<code>delimiter=";"</code>.</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 <code>3,14</code>), ce qui crée un conflit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>1,5;Paris</code> est sans ambiguïté,<br/>
mais <code>1,5,Paris</code> ne l'est pas (s'agit-il d'un<br/>
ou deux champs ?). Excel et LibreOffice en<br/>
version française utilisent donc <code>;</code> 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 <code>csv.DictReader</code>) 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 <code>.csv</code> 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 : <code>.xlsx</code> 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 <code>csv</code>, 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 <code>csv</code>.</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 <code>os.read()</code></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 <code>print('csv')</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>print</code> affiche, ne lit pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec <code>open()</code> puis <code>.split(',')</code> 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 <code>import json</code> et <code>json.load()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>json.load()</code> 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 <code>csv</code> 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><code>csv</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>import csv</code> donne accès aux<br/>
fonctions <code>csv.reader</code>, <code>csv.writer</code>,<br/>
<code>csv.DictReader</code>, <code>csv.DictWriter</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>pandas</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>pandas</code> 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><code>numpy</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p><code>numpy</code> peut lire des CSV via <code>genfromtxt</code>,<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><code>xml.etree</code></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/>
<code>open("data.csv", encoding="utf-8")</code>. 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 <code>csv.reader(f)</code> lorsqu'on l'utilise dans<br/>
une boucle <code>for ligne in csv.reader(f):</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Penser à convertir les valeurs numériques avec<br/>
<code>int()</code> ou <code>float()</code> avant tout calcul. CSV est<br/>
texte : <code>"17" + 1</code> 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 <code>{nom_colonne: valeur}</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est ce que renvoie <code>csv.DictReader</code>,<br/>
pas <code>csv.reader</code>.</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 <code>f</code>.</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 <code>["Alice", "17", "Lyon"]</code>. 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 <code>csv</code> permet d'<strong>écrire</strong><br/>
dans un fichier CSV ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma typique :<br/>
<code>with open("out.csv", "w", newline="", encoding="utf-8") as f:</code><br/>
<code>    w = csv.writer(f) ; w.writerow(["a", "b"])</code>.</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>csv.save()</code></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><code>csv.put()</code></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><code>csv.writer()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on l'utilise avec un fichier<br/>
ouvert en écriture (<code>"w"</code>), puis sa méthode<br/>
<code>.writerow()</code> ou <code>.writerows()</code> ajoute les<br/>
lignes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>csv.write()</code></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 <code>csv.reader</code> et<br/>
<code>csv.DictReader</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p><code>DictReader</code> est généralement préférable quand le<br/>
fichier a un en-tête : le code est plus auto-documenté<br/>
(<code>ligne["age"]</code> plutôt que <code>ligne[2]</code>).</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>DictReader</code> 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><code>reader</code> 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><code>reader</code> produit des listes, <code>DictReader</code> 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 : <code>DictReader</code> consomme la<br/>
première ligne comme en-tête et permet<br/>
ensuite d'écrire <code>ligne["nom"]</code> au lieu de<br/>
<code>ligne[0]</code>. Plus lisible et robuste si l'ordre<br/>
des colonnes change.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>DictReader</code> 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 <code>ligne = ["Alice", "17"]</code>.<br/>
Comment obtenir un âge utilisable comme nombre ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toujours convertir explicitement : <code>int()</code>,<br/>
<code>float()</code>, <code>bool()</code> selon le besoin. Penser aussi<br/>
au cas où la cellule est vide (chaîne <code>""</code>), qui<br/>
provoquerait <code>ValueError</code> avec <code>int()</code>.</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><code>age = int(ligne[1])</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>int()</code> convertit la chaîne<br/>
<code>"17"</code> en entier <code>17</code>, utilisable dans des<br/>
calculs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>age = list(ligne[1])</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>list("17")</code> donne <code>['1', '7']</code>, pas<br/>
un entier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>age = ligne[1].number()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode <code>.number()</code> n'existe pas<br/>
sur les chaînes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>age = ligne[1]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>age</code> reste une <strong>chaîne</strong>. Faire<br/>
<code>age + 1</code> lèverait <code>TypeError</code>.</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 <code>csv</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour les fichiers exportés par Excel français, le<br/>
séparateur est <code>;</code>. Pour les CSV anglo-saxons ou<br/>
Google Sheets, c'est <code>,</code>. Pour TSV (tab-separated),<br/>
c'est <code>'\t'</code>.</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>csv.reader(f).set_separator(';')</code></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><code>csv.reader(f, delimiter=';')</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on précise le délimiteur via<br/>
l'argument nommé <code>delimiter</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>csv.reader_semicolon(f)</code></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><code>csv.reader(f)</code> (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/>
<code>csv.Sniffer</code> 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 : <code>"il dit ""bonjour"""</code>.</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 <code>\,</code></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 : <code>"Lyon, France"</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la convention RFC 4180.<br/>
Le module <code>csv</code> 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 <code>eleves.csv</code> contient :<br/>
<pre><code>nom;age
Alice;17
Bob;16</code></pre><br/>
Que vaut <code>ligne</code> au premier passage de la boucle<br/>
<code>for ligne in csv.DictReader(open("eleves.csv"), delimiter=";")</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour récupérer toutes les lignes d'un coup :<br/>
<code>lignes = list(csv.DictReader(...))</code>.</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>['Alice', '17']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le retour de <code>csv.reader</code>,<br/>
pas de <code>csv.DictReader</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>['nom', 'age']</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>DictReader</code> 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><code>{'nom': 'Alice', 'age': '17'}</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>DictReader</code> saute l'en-tête<br/>
et associe chaque valeur à son nom de colonne.<br/>
Noter que <code>'17'</code> reste une chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>{'Alice': '17', 'Bob': '16'}</code></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 <code>nom,age</code> lu via<br/>
<code>csv.DictReader</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toujours convertir avant de comparer<br/>
numériquement. Pour des manipulations plus<br/>
complexes, <code>pandas</code> 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[<pre><code>for ligne in lecteur:
    print(ligne["nom"]) if ligne["age"] &gt; 16</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : syntaxe Python invalide (le <code>if</code><br/>
ternaire requiert un <code>else</code>) <strong>et</strong> problème<br/>
de type.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>lecteur.filter(age &gt; 16)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la méthode <code>.filter()</code> n'existe pas<br/>
sur <code>csv.DictReader</code>. C'est une syntaxe d'un<br/>
autre langage (SQL ?).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for ligne in lecteur:
    if ligne["age"] &gt; 16:
        print(ligne["nom"])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>ligne["age"]</code> est une <strong>chaîne</strong><br/>
(<code>"17"</code>). En Python 3, comparer une chaîne et<br/>
un entier lève <code>TypeError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>for ligne in lecteur:
    if int(ligne["age"]) &gt; 16:
        print(ligne["nom"])</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on convertit l'âge en entier<br/>
(sinon <code>"17" &gt; 16</code> 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/>
<code>open("data.csv", "w", newline="", encoding="utf-8")</code><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 <code>csv.writer</code>.</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 : <code>newline=""</code> 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 <code>newline=""</code>, Python<br/>
réécrit <code>\n</code> → <code>\r\n</code> sur Windows, et le<br/>
module <code>csv</code> ajoute lui-même un <code>\r\n</code>,<br/>
provoquant des doubles sauts. La solution<br/>
recommandée par la doc est <code>newline=""</code>.</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 <code>nom,age,ville</code> et la ligne<br/>
<code>Alice,,Lyon</code>, que vaut <code>ligne["age"]</code> après lecture<br/>
par <code>csv.DictReader</code> ?</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/>
<code>int(ligne["age"]) if ligne["age"] else None</code>.</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/>
(<code>int("")</code>) qui lèverait <code>ValueError</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>0</code></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><code>None</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>csv.DictReader</code> ne convertit pas<br/>
automatiquement les vides en <code>None</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>''</code> (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 : <code>if ligne["age"] != "":</code>.</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/>
<code>Café</code> au lieu de <code>Café</code>. Quelle est la cause la<br/>
plus probable ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Indice révélateur : <code>é</code> = <code>Ã©</code> 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/>
(<code>’</code> au lieu de <code>’</code>) 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 : <code>é</code> en UTF-8 = <code>0xC3 0xA9</code>. Lu<br/>
comme Latin-1, ces deux octets donnent <code>Ã©</code>.<br/>
Solution : préciser <code>encoding="utf-8"</code> à<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 <code>ligne.split(',')</code> est-il <strong>insuffisant</strong><br/>
pour parser correctement la ligne CSV<br/>
<code>"Doe, John",42,"Lyon, France"</code> ?</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 <code>csv</code>. 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><code>split</code> ne fonctionne que sur des fichiers UTF-8</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>split</code> est indépendant de l'encodage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>split</code> modifie le fichier d'origine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>split</code> ne modifie rien, il renvoie<br/>
une nouvelle liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>split</code> 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 : <code>split(',')</code> produit <code>['\"Doe',<br/>
' John\"', '42', '\"Lyon', ' France\"']</code>. Le<br/>
module <code>csv</code> 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><code>split</code> 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 <code>notes.csv</code> contient une colonne <code>note</code><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[<pre><code>moyenne = csv.mean("notes.csv", "note")</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction <code>csv.mean</code> n'existe pas.<br/>
Le module <code>csv</code> se limite à la lecture/écriture.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>with open("notes.csv") as f:
    moyenne = sum(csv.reader(f)) / 2</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>sum</code> 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[<pre><code>with open("notes.csv") as f:
    total = 0
    for ligne in csv.DictReader(f):
        total += ligne["note"]
    moyenne = total / len(lignes)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>ligne["note"]</code> est une <strong>chaîne</strong>.<br/>
<code>total += "12"</code> lève <code>TypeError</code>. De plus<br/>
<code>lignes</code> n'est pas défini.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>with open("notes.csv") as f:
    notes = [int(ligne["note"]) for ligne in csv.DictReader(f)]
moyenne = sum(notes) / len(notes)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on construit une liste<br/>
d'entiers (conversion explicite avec <code>int</code>),<br/>
puis <code>sum / len</code>. 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/>
<code>donnees = [("Alice", 17), ("Bob", 16)]</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique systématique : <code>with open(...,<br/>
newline="", encoding="utf-8")</code> + <code>csv.writer</code> +<br/>
<code>writerow</code> (en-tête) + <code>writerows</code> (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[<pre><code>csv.write("out.csv", donnees)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction <code>csv.write</code> n'existe<br/>
pas. Il faut un objet <code>writer</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>with open("out.csv", "w") as f:
    f.write(donnees)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>write</code> attend une <strong>chaîne</strong>, pas<br/>
une liste de tuples.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>with open("out.csv", "w") as f:
    for nom, age in donnees:
        f.write(nom + "," + age + "\n")</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>age</code> est un entier, on ne peut pas<br/>
le concaténer à une chaîne avec <code>+</code> (TypeError).<br/>
Et l'en-tête est absent. Et <code>newline=""</code><br/>
manquant pour un usage portable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>with open("out.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["nom", "age"])
    w.writerows(donnees)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>writerow</code> pour l'en-tête,<br/>
<code>writerows</code> (avec <code>s</code>) pour la liste de tuples<br/>
; <code>newline=""</code> pour la portabilité ;<br/>
<code>encoding="utf-8"</code> 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>
