1. À propos des guillemets dans les fichiers CSV
Dans un fichier CSV, les guillemets permettent notamment de protéger une valeur contenant un séparateur, un saut de ligne ou le caractère utilisé comme guillemet. Le module csv de Python gère ce comportement grâce au paramètre quoting.
Par défaut, le module csv utilise généralement le caractère " comme caractère de citation. Par exemple, si une valeur contient une virgule alors que la virgule est le séparateur, csv.writer() place automatiquement cette valeur entre guillemets.
Le programme suivant écrit une valeur contenant une virgule. Avec le comportement par défaut, le champ "Python, Java" est automatiquement placé entre guillemets dans le fichier.
1 2 3 4 5 6 | import csv with open("langages.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer(fichier) ecrivain.writerow(["nom", "langages"]) ecrivain.writerow(["Amine", "Python, Java"]) print("Fichier créé.") |
Sortie :
1 | Fichier créé. |
Le contenu du fichier langages.csv est alors le suivant. Les guillemets permettent de signaler que la virgule située dans "Python, Java" appartient au contenu du champ et ne constitue pas un séparateur de colonnes.
1 2 | nom,langages Amine,"Python, Java" |
Sortie :
1 2 | nom,langages Amine,"Python, Java" |
Le paramètre quoting accepte plusieurs constantes du module csv. Parmi les plus importantes, on trouve csv.QUOTE_MINIMAL, csv.QUOTE_ALL, csv.QUOTE_NONNUMERIC et csv.QUOTE_NONE.
2. Utiliser csv.QUOTE_MINIMAL et csv.QUOTE_ALL
Utiliser csv.QUOTE_MINIMAL
csv.QUOTE_MINIMAL correspond au comportement habituel de csv.writer(). Les champs sont placés entre guillemets uniquement lorsque cela est nécessaire, notamment lorsqu'ils contiennent le séparateur, le caractère de citation ou certains caractères de fin de ligne.
Dans l'exemple suivant, seul le champ contenant une virgule nécessite des guillemets.
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer(fichier, quoting=csv.QUOTE_MINIMAL) ecrivain.writerow(["nom", "description"]) ecrivain.writerow(["Amine", "Étudiant"]) ecrivain.writerow(["Sara", "Python, Java"]) print("Écriture terminée.") |
Sortie :
1 | Écriture terminée. |
Le fichier obtenu contient des guillemets uniquement autour de la valeur qui contient le séparateur.
1 2 3 | nom,description Amine,Étudiant Sara,"Python, Java" |
Sortie :
1 2 3 | nom,description Amine,Étudiant Sara,"Python, Java" |
Utiliser csv.QUOTE_ALL
Avec csv.QUOTE_ALL, tous les champs écrits dans le fichier sont placés entre guillemets, qu'ils contiennent ou non un caractère spécial.
1 2 3 4 5 6 7 | import csv with open("etudiants.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer(fichier, quoting=csv.QUOTE_ALL) ecrivain.writerow(["id", "nom", "ville"]) ecrivain.writerow([1, "Amine", "Oujda"]) ecrivain.writerow([2, "Sara", "Rabat"]) print("Écriture terminée.") |
Sortie :
1 | Écriture terminée. |
Cette fois, toutes les valeurs du fichier sont placées entre guillemets.
1 2 3 | "id","nom","ville" "1","Amine","Oujda" "2","Sara","Rabat" |
Sortie :
1 2 3 | "id","nom","ville" "1","Amine","Oujda" "2","Sara","Rabat" |
3. Utiliser csv.QUOTE_NONNUMERIC
csv.QUOTE_NONNUMERIC demande au writer de placer entre guillemets les valeurs qui ne sont pas numériques. Les objets numériques tels que les entiers et les nombres flottants sont écrits sans guillemets.
Dans l'exemple suivant, les noms sont des chaînes de caractères tandis que les âges et les notes sont fournis au writer sous forme de nombres.
1 2 3 4 5 6 7 | import csv with open("notes.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer(fichier, quoting=csv.QUOTE_NONNUMERIC) ecrivain.writerow(["nom", "age", "note"]) ecrivain.writerow(["Amine", 21, 15.5]) ecrivain.writerow(["Sara", 20, 17]) print("Fichier créé.") |
Sortie :
1 | Fichier créé. |
Les chaînes de caractères sont placées entre guillemets, tandis que les valeurs numériques restent sans guillemets.
1 2 3 | "nom","age","note" "Amine",21,15.5 "Sara",20,17 |
Sortie :
1 2 3 | "nom","age","note" "Amine",21,15.5 "Sara",20,17 |
Lors de la lecture avec quoting=csv.QUOTE_NONNUMERIC, les champs non placés entre guillemets sont convertis en nombres flottants. Pour illustrer clairement ce comportement, utilisons un fichier sans ligne d'en-tête contenant uniquement des noms entre guillemets et des nombres non cités.
1 2 3 4 5 | import csv with open("notes_sans_entete.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.reader(fichier, quoting=csv.QUOTE_NONNUMERIC) for ligne in lecteur: print(ligne) |
Sortie :
1 2 | ['Amine', 21.0, 15.5] ['Sara', 20.0, 17.0] |
Cette conversion automatique explique pourquoi il faut utiliser QUOTE_NONNUMERIC avec précaution lors de la lecture : tout champ non cité doit pouvoir être interprété comme un nombre flottant.
4. Utiliser csv.QUOTE_NONE et escapechar
La constante csv.QUOTE_NONE indique au module csv de ne pas utiliser les guillemets pour protéger les champs. Lorsqu'une valeur contient un caractère nécessitant une protection, il faut alors généralement définir un caractère d'échappement avec le paramètre escapechar.
Dans l'exemple suivant, le caractère antislash est utilisé pour échapper la virgule présente à l'intérieur d'une valeur.
1 2 3 4 5 6 7 8 9 10 | import csv with open("langages.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer( fichier, quoting=csv.QUOTE_NONE, escapechar="\\" ) ecrivain.writerow(["nom", "langages"]) ecrivain.writerow(["Amine", "Python, Java"]) print("Fichier créé.") |
Sortie :
1 | Fichier créé. |
Dans le fichier obtenu, la virgule appartenant au contenu du deuxième champ est précédée du caractère d'échappement.
1 2 | nom,langages Amine,Python\, Java |
Sortie :
1 2 | nom,langages Amine,Python\, Java |
Pour relire correctement ce fichier, on utilise les mêmes paramètres. Le lecteur comprend alors que la virgule échappée appartient au champ "Python, Java".
1 2 3 4 5 6 7 8 9 | import csv with open("langages.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.reader( fichier, quoting=csv.QUOTE_NONE, escapechar="\\" ) for ligne in lecteur: print(ligne) |
Sortie :
1 2 | ['nom', 'langages'] ['Amine', 'Python, Java'] |
Lorsque QUOTE_NONE est utilisé pour l'écriture sans escapechar alors qu'un champ contient un caractère qui doit être échappé, csv.writer() peut lever une csv.Error. Il est donc important de définir une stratégie d'échappement adaptée.
5. Personnaliser quotechar et gérer les guillemets dans les données
Modifier le caractère de citation avec quotechar
Le paramètre quotechar permet de choisir le caractère utilisé pour entourer les champs. Par défaut, il s'agit du guillemet double ". L'exemple suivant utilise l'apostrophe comme caractère de citation avec QUOTE_ALL.
1 2 3 4 5 6 7 8 9 10 11 | import csv with open("etudiants.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer( fichier, quoting=csv.QUOTE_ALL, quotechar="'" ) ecrivain.writerow(["nom", "ville"]) ecrivain.writerow(["Amine", "Oujda"]) ecrivain.writerow(["Sara", "Rabat"]) print("Fichier créé.") |
Sortie :
1 | Fichier créé. |
Le contenu du fichier utilise maintenant l'apostrophe comme caractère de citation.
1 2 3 | 'nom','ville' 'Amine','Oujda' 'Sara','Rabat' |
Sortie :
1 2 3 | 'nom','ville' 'Amine','Oujda' 'Sara','Rabat' |
Gérer un guillemet présent dans une valeur
Un champ peut lui-même contenir le caractère utilisé comme guillemet. Avec le comportement par défaut doublequote=True, Python double le guillemet présent dans la valeur afin de le représenter correctement dans le fichier CSV.
1 2 3 4 5 6 | import csv with open("citations.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer(fichier) ecrivain.writerow(["nom", "message"]) ecrivain.writerow(["Amine", 'Il dit "Bonjour"']) print("Fichier créé.") |
Sortie :
1 | Fichier créé. |
Le champ contenant les guillemets est placé entre guillemets et les guillemets internes sont doublés conformément au format CSV.
1 2 | nom,message Amine,"Il dit ""Bonjour""" |
Sortie :
1 2 | nom,message Amine,"Il dit ""Bonjour""" |
Lors de la lecture du fichier avec csv.reader(), les guillemets de protection sont interprétés automatiquement et la valeur originale est reconstruite.
1 2 3 4 5 | import csv with open("citations.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.reader(fichier) for ligne in lecteur: print(ligne) |
Sortie :
1 2 | ['nom', 'message'] ['Amine', 'Il dit "Bonjour"'] |
Utiliser doublequote=False avec escapechar
Il est possible de désactiver le doublement du caractère de citation avec doublequote=False. Dans ce cas, un escapechar peut être utilisé pour échapper les guillemets présents dans les données.
1 2 3 4 5 6 7 8 9 10 | import csv with open("citations.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer( fichier, doublequote=False, escapechar="\\" ) ecrivain.writerow(["nom", "message"]) ecrivain.writerow(["Amine", 'Il dit "Bonjour"']) print("Fichier créé.") |
Sortie :
1 | Fichier créé. |
Les guillemets appartenant au contenu sont alors précédés du caractère d'échappement.
1 2 | nom,message Amine,Il dit \"Bonjour\" |
Sortie :
1 2 | nom,message Amine,Il dit \"Bonjour\" |
6. À retenir !
Le paramètre quoting du module csv permet de contrôler la manière dont les champs d'un fichier CSV sont protégés par des guillemets. Le choix du mode dépend du format que l'on souhaite produire ou lire.
- csv.QUOTE_MINIMAL ajoute des guillemets uniquement lorsque cela est nécessaire.
- csv.QUOTE_ALL place tous les champs entre guillemets.
- csv.QUOTE_NONNUMERIC demande au writer de citer les valeurs non numériques.
- Avec un reader configuré en QUOTE_NONNUMERIC, les champs non cités sont convertis en nombres flottants.
- csv.QUOTE_NONE désactive l'utilisation des guillemets pour protéger les champs.
- Avec QUOTE_NONE, escapechar permet d'échapper les caractères qui doivent être protégés.
- quotechar permet de personnaliser le caractère utilisé comme guillemet.
- Le caractère de citation par défaut est le guillemet double ".
- Avec doublequote=True, un guillemet présent dans une valeur est doublé lors de l'écriture lorsqu'il doit être échappé.
- Une configuration cohérente entre l'écriture et la lecture garantit une interprétation correcte des données CSV.
Le programme suivant compare simplement les deux modes les plus courants : QUOTE_MINIMAL et QUOTE_ALL. La classe StringIO permet ici d'observer directement le texte CSV produit sans créer de fichier sur le disque.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import csv import io donnees = [ ["nom", "langages"], ["Amine", "Python, Java"] ] minimal = io.StringIO(newline="") ecrivain = csv.writer(minimal, quoting=csv.QUOTE_MINIMAL) ecrivain.writerows(donnees) print("QUOTE_MINIMAL :") print(minimal.getvalue(), end="") tous = io.StringIO(newline="") ecrivain = csv.writer(tous, quoting=csv.QUOTE_ALL) ecrivain.writerows(donnees) print("QUOTE_ALL :") print(tous.getvalue(), end="") |
Sortie :
1 2 3 4 5 6 | QUOTE_MINIMAL : nom,langages Amine,"Python, Java" QUOTE_ALL : "nom","langages" "Amine","Python, Java" |
Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/



