Gérer les données d'un fichier CSV

Un fichier CSV, c'est quoi ?

CSV signifie Comma Separated Values, autrement dit des valeurs séparées par des virgules.

Plus clairement, un fichier CSV est un fichier texte mais dont le contenu est organisé sous forme de tableur (comme ceux que l'on obtient avec LibreOffice Calc ou Microsoft Excel) : les lignes du tableau sont les lignes du fichier et les champs de chaque colonne sont séparés par des virgules.

Prenons, par exemple, le tableau suivant (un carnet de contacts qui nous servira d'exemple tout au long de cette partie) :

 Nom  Prénom  Téléphone
 DOE  John 0610101010
TURING Alan  0611111111
 RITCHIE Dennis 0612121212

Si on l'exporte au format CSV, on obtiendra le fichier texte suivant :

Nom,Prénom,Téléphone
DOE,John,0610101010
TURING,Alan,0611111111
RITCHIE,Dennis,0612121212

De nombreuses applications (les tableurs, les logiciels de comptabilité, Pronote pour les listes d'élèves) permettent un export des données au format CSV.

 Quel intérêt pour nous ? Nous savons déjà utiliser les fichiers !

L'intérêt du format CSV par rapport à un fichier texte classique est que les données y sont rangées, ordonnées, comme dans un tableau. Ce n'est pas le cas dans un fichier texte classique.

Autre intérêt : de nombreux sites mettent en ligne des fichiers de données comme par exemple les données de recensement d'une ville.

Cela peut être intéressant de savoir les manipuler.

Un exemple "étonnant" de fichier CSV à voir ici. Il recense des information sur les passagers du Titanic.

Créer, lire et modifier un fichier CSV avec les fonctions reader et writer du module csv

--- Créer un fichier CSV

# importation du module CSV de Python
import csv

# Données à stocker dans le fichier (sous forme d'une liste de tuples)
data =[("Nom","Prénom","Téléphone"),("DOE","John", "0610101010"),("TURING", "Alan", "0611111111"),
       ("RITCHIE","Dennis","0613131313")
    ]

# Ouvrir le fichier en mode écriture
fichiercsv = open('data.csv','w')

# Créer l'objet fichier
objet = csv.writer(fichiercsv)
# Chaque élément de data correspond à une ligne
for element in data:
    objet.writerow(element)
fichiercsv.close()

Comprendre le programme :

  • import csv : on importe le module csv de python qui contient les fonctions permettant de manipuler les fichiers CSV
  • fichiercsv = open('data.csv','w') : on ouvre ou on crée, s'il n'existe pas (mode w pour write), le fichier data.csv.

Attention, s'il existe déjà, tout son contenu sera effacé !

  • objet = csv.writer(fichiercsv) : on crée un objet d'écriture dans lequel on va écrire le contenu
  • Pour chaque élément de la liste data, on écrit la ligne dans le fichier à l'aide de la méthode writerow
  • fichiercsv.close() : on ferme le fichier

--- Lire le contenu d'un fichier CSV

# Lire le fichier avec reader de csv
with open('data.csv', 'r') as fichiercsv:
    reader = csv.reader(fichiercsv , delimiter=',')
    for row in reader:
        print(row)
fichiercsv.close()

Comprendre le programme :

  • on ouvre le fichier en lecture (mode r pour read)
  • on crée un objet qui stocke le contenu du fichier et précise le délimiteur entre les champs (pour nous la virgule)
  • on parcourt chaque ligne et l'objet et on l'affiche

--- Ajouter une ligne au fichier CSV

# Ecrire dans un fichier CSV avec writer
with open('data.csv','a',newline='') as fichier:
    writer = csv.writer(fichier)
    writer.writerow(['VAN ROSSUM','Guido', '0614141414'])
fichiercsv.close()

# Lire le fichier avec reader de csv
with open('data.csv', 'r') as fichier:
    reader = csv.reader(fichier , delimiter=',')
    for row in reader:
        print(row)
fichiercsv.close()

Comprendre le programme :

  • On retrouve le même code que pour créer un fichier à la seule différence qu'au moment de l'ouverture, on utilise le mode a plutôt que le mode w.
  • On ajoute une ligne avec la méthode writerow de la classe writer.

Créer, lire et modifier un fichier CSV sous forme de dictionnaire : les méthodes DictReader(), DictWriter()

## importation du module CSV de Python
import csv

# Données à stocker dans le fichier (sous forme de dictionnaire, cette fois)
data =[{"Nom" : "DOE","Prénom" : "John", "Téléphone" : "0610101010"},
       {"Nom" : "TURING", "Prénom" : "Alan", "Téléphone" : "0611111111"},
       {"Nom" : "RITCHIE","Prénom" : "Dennis", "Téléphone": "0613131313"}
    ]

# création du fichier
with open('data2.csv', 'w', newline='') as fichiercsv:
    # détermination des noms des champs du tableau (entêtes)
    fieldnames = ['Nom', 'Prénom','Téléphone']
    # création de l'objet avec les noms des champs 
    writer = csv.DictWriter(fichiercsv, fieldnames=fieldnames)
    # écriture de la ligne avec les entêtes en utilisant la méthode writerheader()
    writer.writeheader()
    # écriture des autres lignes avec le contenu de data en utilisant la méthode writerow()
    for element in data:
        writer.writerow(element)
# fermeture du fichier
fichiercsv.close()

# Lecture (même fonctionnement qu'avec la classe reader de csv sauf que l'on renvoie un dictionnaire)
with open('data2.csv', newline='') as fichiercsv:
    reader = csv.DictReader(fichiercsv)
    for row in reader:
        print(row)
fichiercsv.close()

# recherche d'un élément dans le dictionnaire
with open('data2.csv', newline = '') as fichiercsv:
    reader = csv.DictReader(fichiercsv)
    for row in reader:
        if row["Nom"] == "DOE":
            print(row["Nom"], " : ", row["Téléphone"])
fichiercsv.close()

Comprendre le programme :

  • voir les commentaires dans le code ci-dessus