\documentclass[a4paper,11pt]{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais,bloc,completemulti]{automultiplechoice}
\usepackage[french]{babel}
\usepackage{amsmath, amssymb}

\title{Fichiers CSV}
\date{Numérique et sciences informatiques}

\begin{document}

\noindent\textbf{Fichiers CSV} \hfill \textit{Numérique et sciences informatiques}\\[0.4em]
Nom~: \dotfill\ Prénom~: \dotfill

\bigskip

\element{premierefichierscsv}{
  \begin{question}{q01}
    Que signifie l'acronyme \textbf{CSV} ?
    \begin{choices}
    \correctchoice{Comma Separated Values (valeurs séparées par des virgules)}
    \wrongchoice{Computer System Variables}
    \wrongchoice{Compressed Storage Vector}
    \wrongchoice{Centered Spreadsheet View}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q02}
    Quelle est la structure de base d'un fichier CSV ?
    \begin{choices}
    \wrongchoice{Un fichier XML structuré par balises}
    \wrongchoice{Un format JSON imbriqué}
    \correctchoice{Un fichier texte où chaque ligne est un enregistrement et chaque champ est séparé par un délimiteur}
    \wrongchoice{Un fichier binaire avec en-tête et indexation}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q03}
    Pourquoi en France utilise-t-on souvent le \textbf{point-virgule}
\texttt{;} comme séparateur dans les fichiers CSV ?
    \begin{choices}
    \wrongchoice{Parce que la norme ISO l'exige}
    \wrongchoice{Parce que les fichiers seraient sinon trop volumineux}
    \correctchoice{Parce que la virgule est utilisée comme séparateur décimal en français (par exemple \texttt{3,14}), ce qui crée un conflit}
    \wrongchoice{Parce que le point-virgule est plus rapide à taper}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q04}
    À quoi sert la \textbf{première ligne} d'un fichier CSV ?
    \begin{choices}
    \wrongchoice{Elle indique la taille du fichier}
    \wrongchoice{Elle contient toujours les données du premier enregistrement}
    \wrongchoice{Elle est obligatoirement vide}
    \correctchoice{Elle contient les noms des colonnes (en-tête)}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q05}
    Quelle est l'extension habituelle d'un fichier CSV ?
    \begin{choices}
    \wrongchoice{.json}
    \wrongchoice{.txt}
    \correctchoice{.csv}
    \wrongchoice{.xlsx}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q06}
    Sans utiliser le module \texttt{csv}, comment peut-on lire
un fichier CSV simple en Python ?
    \begin{choices}
    \wrongchoice{Avec \texttt{os.read()}}
    \wrongchoice{Avec \texttt{print('csv')}}
    \correctchoice{Avec \texttt{open()} puis \texttt{.split(',')} sur chaque ligne}
    \wrongchoice{Avec \texttt{import json} et \texttt{json.load()}}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q07}
    Quel module de la bibliothèque standard de Python
facilite la manipulation des fichiers CSV ?
    \begin{choices}
    \correctchoice{\texttt{csv}}
    \wrongchoice{\texttt{pandas}}
    \wrongchoice{\texttt{numpy}}
    \wrongchoice{\texttt{xml.etree}}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q08}
    Quel \textbf{encodage} est aujourd'hui recommandé pour les
fichiers CSV ?
    \begin{choices}
    \wrongchoice{ISO-8859-1 uniquement}
    \wrongchoice{Binaire compressé}
    \correctchoice{UTF-8}
    \wrongchoice{ASCII pur}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q09}
    Que renvoie \texttt{csv.reader(f)} lorsqu'on l'utilise dans
une boucle \texttt{for ligne in csv.reader(f):} ?
    \begin{choices}
    \wrongchoice{Un dictionnaire \texttt{\{nom\_colonne: valeur\}}}
    \wrongchoice{Une chaîne de caractères pour chaque ligne}
    \wrongchoice{Un tuple immuable}
    \correctchoice{Une liste des champs de chaque ligne}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q10}
    Quelle fonction du module \texttt{csv} permet d'\textbf{écrire}
dans un fichier CSV ?
    \begin{choices}
    \wrongchoice{\texttt{csv.save()}}
    \wrongchoice{\texttt{csv.put()}}
    \correctchoice{\texttt{csv.writer()}}
    \wrongchoice{\texttt{csv.write()}}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q11}
    Quelle est la différence entre \texttt{csv.reader} et
\texttt{csv.DictReader} ?
    \begin{choices}
    \wrongchoice{\texttt{DictReader} lit plus vite}
    \wrongchoice{\texttt{reader} n'existe pas en Python 3}
    \correctchoice{\texttt{reader} produit des listes, \texttt{DictReader} produit des dictionnaires indexés par les noms de colonnes (lus depuis l'en-tête)}
    \wrongchoice{\texttt{DictReader} ignore l'en-tête}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q12}
    Après lecture, on obtient \texttt{ligne = ["Alice", "17"]}.
Comment obtenir un âge utilisable comme nombre ?
    \begin{choices}
    \correctchoice{\texttt{age = int(ligne[1])}}
    \wrongchoice{\texttt{age = list(ligne[1])}}
    \wrongchoice{\texttt{age = ligne[1].number()}}
    \wrongchoice{\texttt{age = ligne[1]}}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q13}
    Comment lire un CSV utilisant le \textbf{point-virgule}
comme séparateur avec le module \texttt{csv} ?
    \begin{choices}
    \wrongchoice{\texttt{csv.reader(f).set\_separator(';')}}
    \correctchoice{\texttt{csv.reader(f, delimiter=';')}}
    \wrongchoice{\texttt{csv.reader\_semicolon(f)}}
    \wrongchoice{\texttt{csv.reader(f)} (suffisant, le module détecte tout seul)}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q14}
    Comment représente-t-on un champ contenant le
caractère séparateur (par exemple une virgule) dans
un CSV à séparateur virgule ?
    \begin{choices}
    \wrongchoice{On échappe la virgule avec un antislash \texttt{\textbackslash{},}}
    \wrongchoice{On supprime la virgule du champ}
    \wrongchoice{On change le séparateur pour ce champ uniquement}
    \correctchoice{On entoure le champ de guillemets doubles : \texttt{"Lyon, France"}}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q15}
    Le fichier \texttt{eleves.csv} contient :
\begin{lstlisting}
nom;age
Alice;17
Bob;16
\end{lstlisting}
Que vaut \texttt{ligne} au premier passage de la boucle
\texttt{for ligne in csv.DictReader(open("eleves.csv"), delimiter=";")} ?
    \begin{choices}
    \wrongchoice{\texttt{['Alice', '17']}}
    \wrongchoice{\texttt{['nom', 'age']}}
    \correctchoice{\texttt{\{'nom': 'Alice', 'age': '17'\}}}
    \wrongchoice{\texttt{\{'Alice': '17', 'Bob': '16'\}}}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q16}
    Comment afficher seulement les élèves de plus de
16 ans à partir d'un CSV \texttt{nom,age} lu via
\texttt{csv.DictReader} ?
    \begin{choices}
    \wrongchoice{\begin{lstlisting}
for ligne in lecteur:
    print(ligne["nom"]) if ligne["age"] > 16
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
lecteur.filter(age > 16)
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
for ligne in lecteur:
    if ligne["age"] > 16:
        print(ligne["nom"])
\end{lstlisting}
}
    \correctchoice{\begin{lstlisting}
for ligne in lecteur:
    if int(ligne["age"]) > 16:
        print(ligne["nom"])
\end{lstlisting}
}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q17}
    Pourquoi écrit-on souvent
\texttt{open("data.csv", "w", newline="", encoding="utf-8")}
pour écrire un CSV ?
    \begin{choices}
    \wrongchoice{Pour ajouter une ligne d'en-tête automatiquement}
    \wrongchoice{Pour rendre le fichier illisible par les humains}
    \correctchoice{Pour éviter d'insérer des lignes vides entre chaque enregistrement sous Windows (problème classique de gestion des fins de ligne)}
    \wrongchoice{Pour augmenter les performances}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q18}
    Dans un CSV avec \texttt{nom,age,ville} et la ligne
\texttt{Alice,,Lyon}, que vaut \texttt{ligne["age"]} après lecture
par \texttt{csv.DictReader} ?
    \begin{choices}
    \wrongchoice{Le programme lève une exception}
    \wrongchoice{\texttt{0}}
    \wrongchoice{\texttt{None}}
    \correctchoice{\texttt{''} (chaîne vide)}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q19}
    Quelle situation correspond à un cas d'usage typique
du format CSV ?
    \begin{choices}
    \correctchoice{Échanger un tableau de notes entre Pronote, un tableur et un script Python}
    \wrongchoice{Stocker une vidéo HD}
    \wrongchoice{Construire une page web interactive}
    \wrongchoice{Programmer un microcontrôleur}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q20}
    Pour stocker une \textbf{liste plate de personnes}
(nom, âge, ville), CSV ou JSON ?
    \begin{choices}
    \wrongchoice{JSON est obligatoire dès qu'on programme}
    \correctchoice{CSV est le plus adapté car les données sont tabulaires et plates}
    \wrongchoice{Aucun, il faut une base de données}
    \wrongchoice{XML est toujours le bon choix}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q21}
    Un élève lit un CSV créé sous Windows et obtient
\texttt{Café} au lieu de \texttt{Café}. Quelle est la cause la
plus probable ?
    \begin{choices}
    \wrongchoice{Python est trop ancien pour gérer l'UTF-8}
    \wrongchoice{Le fichier est corrompu}
    \correctchoice{Le fichier est encodé en UTF-8 mais lu comme du Latin-1 (ISO-8859-1)}
    \wrongchoice{La connexion internet est instable}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q22}
    Pourquoi \texttt{ligne.split(',')} est-il \textbf{insuffisant}
pour parser correctement la ligne CSV
\texttt{"Doe, John",42,"Lyon, France"} ?
    \begin{choices}
    \wrongchoice{\texttt{split} ne fonctionne que sur des fichiers UTF-8}
    \wrongchoice{\texttt{split} modifie le fichier d'origine}
    \correctchoice{\texttt{split} ne respecte pas les guillemets et coupe à chaque virgule, donnant 5 champs au lieu de 3}
    \wrongchoice{\texttt{split} est trop lent}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q23}
    Le fichier \texttt{notes.csv} contient une colonne \texttt{note}
(entête en première ligne) avec des nombres entiers.
Quel code calcule correctement la \textbf{moyenne} ?
    \begin{choices}
    \wrongchoice{\begin{lstlisting}
moyenne = csv.mean("notes.csv", "note")
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
with open("notes.csv") as f:
    moyenne = sum(csv.reader(f)) / 2
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
with open("notes.csv") as f:
    total = 0
    for ligne in csv.DictReader(f):
        total += ligne["note"]
    moyenne = total / len(lignes)
\end{lstlisting}
}
    \correctchoice{\begin{lstlisting}
with open("notes.csv") as f:
    notes = [int(ligne["note"]) for ligne in csv.DictReader(f)]
moyenne = sum(notes) / len(notes)
\end{lstlisting}
}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q24}
    Quel code écrit correctement un CSV avec en-tête à
partir d'une liste de tuples
\texttt{donnees = [("Alice", 17), ("Bob", 16)]} ?
    \begin{choices}
    \wrongchoice{\begin{lstlisting}
csv.write("out.csv", donnees)
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
with open("out.csv", "w") as f:
    f.write(donnees)
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
with open("out.csv", "w") as f:
    for nom, age in donnees:
        f.write(nom + "," + age + "\n")
\end{lstlisting}
}
    \correctchoice{\begin{lstlisting}
with open("out.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["nom", "age"])
    w.writerows(donnees)
\end{lstlisting}
}
    \end{choices}
  \end{question}
}

\element{premierefichierscsv}{
  \begin{question}{q25}
    Parmi les affirmations suivantes sur le format CSV,
laquelle est \textbf{fausse} ?
    \begin{choices}
    \correctchoice{CSV impose une typage explicite des colonnes (entier, flottant, date)}
    \wrongchoice{CSV ne gère pas nativement les structures hiérarchiques (listes imbriquées, dictionnaires)}
    \wrongchoice{CSV est un format texte, lisible avec n'importe quel éditeur}
    \wrongchoice{Le séparateur n'est pas standardisé universellement (virgule, point-virgule, tabulation...)}
    \end{choices}
  \end{question}
}


\onecopy{1}{
  \shufflegroup{premierefichierscsv}
  \insertgroup{premierefichierscsv}
}

\end{document}
