Chargement de fichiers CSV

La saisie clavier est limitée à de petites quantités de données. Pour manipuler de plus grands volumes d'information, un script Python peut récupérer ces données depuis un fichier.

Dans ce chapitre, nous allons nous intéresser à la manipulation de fichiers afin de charger des données en mémoire en vue d'un traitement informatique. Nous nous limiterons pour le moment à un format de fichier texte relativement simple à exploiter.

Format CSV

Le format de fichier CSV pour Comma-Separated Values organise les données sous forme de colonnes, celles-ci étant séparées par une virgule ou un point virgule. Ci-dessous, un extrait du fichier data.csv.

Time;PositionX;PositionY
0;0.0;1.9
0.01;0.07;1.98
0.02;0.14;2.06
0.03;0.21;2.14
0.04;0.28;2.21
0.05;0.35;2.29
0.06;0.42;2.36
0.07;0.49;2.44
0.08;0.56;2.51
0.09;0.63;2.58
0.1;0.7;2.65

Nous allons étudier en détail un premier script Python qui consiste à ouvrir un fichier CSV pour en afficher son contenu à l'écran ligne par ligne.

# Chargement du fichier data.csv en lecture seule
datafile = open("data.csv","r")

while True:
    # Lecture d'une nouvelle ligne dans le fichier
    line = datafile.readline()

    # Si la ligne est vide, la fin du fichier a été atteinte
    if line == "":
        break

    # Affiche à l'écran la ligne lue dans le fichier
    print(line)

datafile.close()

La fonction open() ouvre un fichier dont le nom est passé en premier paramètre dans un mode donné. Le tableau recense les modes les plus usuels pour l'ouverture de fichiers en Python.

Mode Description
r Lecture seule
r+ Lecture et écriture en début de fichier
a+ Lecture et écriture en fin de fichier
w Écriture seule

La boucle infinie While True permet de répéter la lecture d'une ligne du fichier. Cette opération est réalisée par la méthode readLine() de la variable datafile qui retourne le contenu de la ligne courante sous la forme d'une chaîne de caractères avant d'avancer jusqu'à la ligne suivante.

La méthode readLine() retourne une chaîne vide lorsque la fin du fichier a été atteinte.

Info

L'instruction break permet au script de sortir d'une boucle.

Listes

Afin d'entreprendre des traitements sur les données du fichier CSV, il convient d'isoler les valeurs de chaque colonne au sein d'une même ligne. Le script Python ci-dessous utilise la méthode split() de la variable line qui retourne une liste de valeurs en précisant le caractère séparateur, ici ;.

datafile = open("data.csv", "r")

# Lit la première ligne du fichier (entête de colonnes)
# pour avancer jusqu'à la ligne 2
datafile.readline()

while True:
    # Lecture d'une nouvelle ligne dans le fichier
    line = datafile.readline()

    # Si la ligne est vide, la fin du fichier a été atteinte
    if line == "":
        break

    # Extraction des cellules de la ligne courante
    value = line.split(";")
    
    # Affichage de la cellule dans la 3ème colonne 
    print(float(value[2]))

datafile.close()

Mais qu'est-ce qu'une liste ? Il s'agit d'une structure de données permettant de stocker plusieurs valeurs. Dans notre cas, la liste value contient 3 valeurs correspondant respectivement aux trois colonnes de la ligne courante du fichier CSV. Chaque valeur dans la liste est repérée par son indice, sachant que la première case a pour indice 0.

            _________________  
           |     |     |     |
   value   | 0.9 | 1.6 | 2.8 |
           |     |     |     |
            -----------------  
              0     1     2
  

Ainsi, pour accéder à la valeur correspondant à la colonne PositionYde la ligne courante, il suffit d'écrire value[2].

Info

Comme pour les chaînes de caractères, l'opérateur [] permet d'extraire une valeur individuelle de la liste.
>>> cadeau = []
>>> cadeau.append("cravate")
>>> cadeau.append("chocolats")
>>> cadeau.append("iPhone X")
>>> print(cadeau)
["cravate", "chocolats", "iPhone X"]
>>> len(cadeau)
3
>>> print(cadeau[-1])
iPhone X

Comme illsutré ci-dessus, on créé une liste vide avec l'opérateur []. La méthode append() permet d'ajouter une nouvelle valeur à la fin d'une liste et la fonction len() retourne la taille de la liste.

Info

Si l'indice utilisé dans l'opérateur [] est négatif, on accède à l'élément à partir de la fin de la liste. Ainsi l'indice -1 correspond au dernier élément de la liste, l'indice -2 à l'avant dernier, etc.

Exercice

Écrivez un script Python loadcsv.py qui créé trois listes t, px et py qui, après ouverture et lecture du fichier data.csv, contiendront toutes les valeurs des colonnes Time, PositionX et PositionY respectivement.

Correction
# Liste des intervalles de temps
t = []
# Liste des positions successives
px = []
py = []

datafile = open("data.csv", "r")

# Lit la première ligne du fichier (entête de colonnes)
# pour avancer jusqu'à la ligne 2
datafile.readline()

while True:
    line = datafile.readline()
    
    if line == "":
        break

    value = line.split(";")
    t.append(float(value[0]))
    px.append(float(value[1]))
    py.append(float(value[2]))
    
datafile.close()

Le fichier data.csv décrit la trajectoire (simulée) d'un ballon de basketball. Maintenant que les données sont stockées en mémoire sous la forme de listes, on peut envisager des traitements informatiques pour extraire des informations spécifiques.

Exercice

Modifier le script loadcsv.py afin de calculer la flèche de la trajectoire, à savoir les coordonnées du point d'altitude maximale.


Étude du lancer d'un ballon de basketball

Flèche de la trajectoire :
(5.46,5.16) à t=0.78s.
Correction
print("\nÉtude du lancer d'un ballon de basketball")

# Liste des intervalles de temps
t = []
# Liste des positions successives
px = []
py = []

file = open("data.csv","r")

# Lit la première ligne du fichier (entête de colonnes)
# pour avancer jusqu'à la ligne 2
file.readline()

while True:
    line = file.readline()
    if line == "":
        break

    value = line.split(";")
    t.append(float(value[0]))
    px.append(float(value[1]))
    py.append(float(value[2]))

# Recherche de la flèche de la trajectoire
ymax = py[0]
imax = 0
for i in range(1,len(py)):
    if py[i] > ymax:
        ymax = py[i]
        imax = i

print("\nFlèche de la trajectoire :")
print("("+str(px[imax])+","+str(py[imax])+") à t="+str(t[imax])+"s.")

Exercice

Ajouter au script loadcsv.py le calcul du point d'impact correspondant au dernier instant où l'altitude du ballon est positive.


Étude du lancer d'un ballon de basketball

Flèche de la trajectoire :
(5.46,5.16) à t=0.78s.

Point d'impact :
(12.88,0.01) à t=1.84s.
Correction
print("\nÉtude du lancer d'un ballon de basketball")

# Liste des intervalles de temps
t = []
# Liste des positions successives
px = []
py = []

file = open("data.csv","r")

# Lit la première ligne du fichier (entête de colonnes)
# pour avancer jusqu'à la ligne 2
file.readline()

while True:
    line = file.readline()
    if line == "":
        break

    value = line.split(";")
    t.append(float(value[0]))
    px.append(float(value[1]))
    py.append(float(value[2]))

# Recherche de la flèche de la trajectoire
ymax = py[0]
imax = 0
for i in range(1,len(py)):
    if py[i] > ymax:
        ymax = py[i]
        imax = i

print("\nFlèche de la trajectoire :")
print("("+str(px[imax])+","+str(py[imax])+") à t="+str(t[imax])+"s.")

# Recherche du point d'impact
i = 0
while py[i] > 0:
    i = i + 1

print("\nPoint d'impact :")
print("("+str(px[i-1])+","+str(py[i-1])+") à t="+str(t[i-1])+"s.")

Ce nouveau chapitre a permis de vous initier aux techniques de lecture de fichiers texte. Mais je suis persuadé que vous brûlez d'impatience de visualiser cette trajectoire sur un graphique. Dans ce cas, passez directement au chapitre suivant !