1. À propos des séparateurs dans les fichiers CSV
Dans un fichier CSV, les différentes valeurs d'une ligne sont séparées par un caractère appelé séparateur ou délimiteur. Malgré le nom CSV, qui signifie Comma-Separated Values, la virgule n'est pas le seul séparateur possible.
On rencontre fréquemment la virgule, le point-virgule, la tabulation ou encore le caractère |. Avec le module csv de Python, le paramètre delimiter permet d'indiquer le séparateur utilisé.
Le fichier suivant utilise la virgule comme séparateur classique.
1 2 3 4 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 2,Sara,20,Rabat,17 3,Yassine,22,Fès,13.5 |
Sortie :
1 2 3 4 | id,nom,age,ville,note 1,Amine,21,Oujda,15.5 2,Sara,20,Rabat,17 3,Yassine,22,Fès,13.5 |
Le même ensemble de données peut être enregistré avec un point-virgule comme séparateur.
1 2 3 4 | id;nom;age;ville;note 1;Amine;21;Oujda;15.5 2;Sara;20;Rabat;17 3;Yassine;22;Fès;13.5 |
Sortie :
1 2 3 4 | id;nom;age;ville;note 1;Amine;21;Oujda;15.5 2;Sara;20;Rabat;17 3;Yassine;22;Fès;13.5 |
Pour lire correctement ce deuxième fichier, il faut informer le module csv que le séparateur utilisé est le point-virgule.
2. Lire un fichier CSV avec un séparateur personnalisé
La fonction csv.reader() accepte le paramètre delimiter. Pour lire un fichier utilisant le point-virgule, on utilise delimiter=";".
Supposons que le fichier etudiants.csv utilise le point-virgule. Le programme suivant lit correctement chaque colonne.
1 2 3 4 5 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.reader(fichier, delimiter=";") for ligne in lecteur: print(ligne) |
Sortie :
1 2 3 4 | ['id', 'nom', 'age', 'ville', 'note'] ['1', 'Amine', '21', 'Oujda', '15.5'] ['2', 'Sara', '20', 'Rabat', '17'] ['3', 'Yassine', '22', 'Fès', '13.5'] |
Une fois le séparateur correctement indiqué, les colonnes peuvent être récupérées par leur indice comme avec n'importe quel autre fichier CSV.
1 2 3 4 5 6 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.reader(fichier, delimiter=";") next(lecteur) for ligne in lecteur: print(ligne[1], "-", ligne[3]) |
Sortie :
1 2 3 | Amine - Oujda Sara - Rabat Yassine - Fès |
Utiliser une tabulation comme séparateur
Pour lire un fichier dont les colonnes sont séparées par des tabulations, on utilise le caractère spécial \t comme valeur de delimiter.
1 2 3 4 5 | import csv with open("etudiants.tsv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.reader(fichier, delimiter="\t") for ligne in lecteur: print(ligne) |
Sortie :
1 2 3 | ['id', 'nom', 'age'] ['1', 'Amine', '21'] ['2', 'Sara', '20'] |
3. Écrire un fichier CSV avec un séparateur personnalisé
Le paramètre delimiter fonctionne également avec csv.writer(). Il permet de choisir le caractère qui séparera les différentes valeurs lors de l'écriture du fichier.
Le programme suivant crée un fichier CSV utilisant le point-virgule comme séparateur.
1 2 3 4 5 6 7 8 9 10 11 | import csv donnees = [ ["id", "nom", "age", "ville"], [1, "Amine", 21, "Oujda"], [2, "Sara", 20, "Rabat"], [3, "Yassine", 22, "Fès"] ] with open("etudiants.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer(fichier, delimiter=";") ecrivain.writerows(donnees) print("Fichier créé avec succès.") |
Sortie :
1 | Fichier créé avec succès. |
Le fichier créé utilise alors un point-virgule entre chaque valeur.
1 2 3 4 | id;nom;age;ville 1;Amine;21;Oujda 2;Sara;20;Rabat 3;Yassine;22;Fès |
Sortie :
1 2 3 4 | id;nom;age;ville 1;Amine;21;Oujda 2;Sara;20;Rabat 3;Yassine;22;Fès |
Utiliser le caractère | comme séparateur
Il est également possible d'utiliser le caractère | comme délimiteur. Il suffit de fournir ce caractère au paramètre delimiter.
1 2 3 4 5 6 7 8 9 10 | import csv donnees = [ ["nom", "langage"], ["Amine", "Python"], ["Sara", "Java"] ] with open("langages.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.writer(fichier, delimiter="|") ecrivain.writerows(donnees) print("Fichier créé.") |
Sortie :
1 | Fichier créé. |
Le contenu du fichier langages.csv obtenu est alors le suivant.
1 2 3 | nom|langage Amine|Python Sara|Java |
Sortie :
1 2 3 | nom|langage Amine|Python Sara|Java |
4. Utiliser différents séparateurs avec DictReader et DictWriter
Le paramètre delimiter peut également être utilisé avec csv.DictReader() et csv.DictWriter(). Ces classes sont particulièrement pratiques lorsque le fichier possède une ligne d'en-tête.
Lire avec DictReader
Supposons que le fichier etudiants.csv utilise le point-virgule. Le programme suivant permet d'accéder directement aux colonnes "nom", "age" et "ville".
1 2 3 4 5 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: lecteur = csv.DictReader(fichier, delimiter=";") for ligne in lecteur: print(ligne["nom"], "-", ligne["age"], "-", ligne["ville"]) |
Sortie :
1 2 3 | Amine - 21 - Oujda Sara - 20 - Rabat Yassine - 22 - Fès |
Écrire avec DictWriter
Pour écrire des dictionnaires dans un fichier utilisant un séparateur personnalisé, on transmet également delimiter à csv.DictWriter(). Le programme suivant crée un fichier séparé par des points-virgules.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import csv colonnes = ["id", "nom", "ville"] donnees = [ {"id": 1, "nom": "Amine", "ville": "Oujda"}, {"id": 2, "nom": "Sara", "ville": "Rabat"}, {"id": 3, "nom": "Yassine", "ville": "Fès"} ] with open("etudiants.csv", "w", newline="", encoding="utf-8") as fichier: ecrivain = csv.DictWriter( fichier, fieldnames=colonnes, delimiter=";" ) ecrivain.writeheader() ecrivain.writerows(donnees) print("Écriture terminée.") |
Sortie :
1 | Écriture terminée. |
Le fichier généré possède alors le contenu suivant.
1 2 3 4 | id;nom;ville 1;Amine;Oujda 2;Sara;Rabat 3;Yassine;Fès |
Sortie :
1 2 3 4 | id;nom;ville 1;Amine;Oujda 2;Sara;Rabat 3;Yassine;Fès |
Convertir un fichier d'un séparateur vers un autre
Le module csv permet facilement de convertir un fichier utilisant un point-virgule en un nouveau fichier utilisant une virgule. Il suffit d'utiliser des délimiteurs différents pour la lecture et l'écriture.
1 2 3 4 5 6 7 8 | import csv with open("source.csv", "r", newline="", encoding="utf-8") as source, \ open("destination.csv", "w", newline="", encoding="utf-8") as destination: lecteur = csv.reader(source, delimiter=";") ecrivain = csv.writer(destination, delimiter=",") for ligne in lecteur: ecrivain.writerow(ligne) print("Conversion terminée.") |
Sortie :
1 | Conversion terminée. |
5. Détecter automatiquement le séparateur d'un fichier CSV
Il arrive que le séparateur utilisé dans un fichier soit inconnu. Le module csv fournit la classe csv.Sniffer, capable d'analyser un échantillon du fichier et d'essayer d'en déterminer le format.
La méthode sniff() retourne un dialecte dont l'attribut delimiter contient le séparateur détecté. Dans l'exemple suivant, le fichier contient des points-virgules.
1 2 3 4 | import csv texte = "id;nom;age\n1;Amine;21\n2;Sara;20\n" dialecte = csv.Sniffer().sniff(texte) print(repr(dialecte.delimiter)) |
Sortie :
1 | ';' |
Pour un fichier réel, on peut lire un échantillon de son contenu, détecter le séparateur, revenir au début avec seek(0), puis utiliser le dialecte détecté avec csv.reader().
1 2 3 4 5 6 7 8 9 | import csv with open("etudiants.csv", "r", newline="", encoding="utf-8") as fichier: echantillon = fichier.read(1024) fichier.seek(0) dialecte = csv.Sniffer().sniff(echantillon, delimiters=",;\t|") print("Séparateur :", repr(dialecte.delimiter)) lecteur = csv.reader(fichier, dialect=dialecte) for ligne in lecteur: print(ligne) |
Sortie :
1 2 3 4 5 | Séparateur : ';' ['id', 'nom', 'age', 'ville', 'note'] ['1', 'Amine', '21', 'Oujda', '15.5'] ['2', 'Sara', '20', 'Rabat', '17'] ['3', 'Yassine', '22', 'Fès', '13.5'] |
La détection avec csv.Sniffer est pratique, mais elle repose sur l'analyse d'un échantillon. Pour un format connu à l'avance, il est généralement préférable d'indiquer explicitement le séparateur avec delimiter.
6. À retenir !
Le module csv permet de travailler avec des fichiers utilisant différents séparateurs. Le paramètre delimiter permet de préciser le caractère utilisé pour séparer les différentes colonnes.
- La virgule est le séparateur CSV classique, mais elle n'est pas obligatoire.
- Le point-virgule est fréquemment utilisé comme séparateur dans les fichiers CSV.
- Le paramètre delimiter=";" permet de travailler avec un fichier séparé par des points-virgules.
- Le paramètre delimiter="\t" permet de travailler avec des valeurs séparées par des tabulations.
- Le caractère | peut également être utilisé comme séparateur.
- csv.reader() accepte le paramètre delimiter lors de la lecture.
- csv.writer() accepte le paramètre delimiter lors de l'écriture.
- csv.DictReader() et csv.DictWriter() acceptent également un séparateur personnalisé.
- csv.Sniffer().sniff() peut tenter de détecter automatiquement le format et le séparateur d'un fichier.
- Lorsque le séparateur est connu, il est préférable de le préciser explicitement.
Le programme suivant résume l'utilisation d'un séparateur personnalisé en lisant un fichier utilisant le point-virgule puis en créant un nouveau fichier utilisant la virgule.
1 2 3 4 5 6 7 8 | import csv with open("source.csv", "r", newline="", encoding="utf-8") as source, \ open("destination.csv", "w", newline="", encoding="utf-8") as destination: lecteur = csv.reader(source, delimiter=";") ecrivain = csv.writer(destination, delimiter=",") for ligne in lecteur: ecrivain.writerow(ligne) print("Le séparateur a été converti avec succès.") |
Sortie :
1 | Le séparateur a été converti avec succès. |
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/



