Note

Il existe des fonctions de la bibliothèque standard (open) qui permettent d’accéder au contenu d’un fichier puis d’écrire dans un fichier. Nous ne présentons pas ici ces fonctions pour ne pas alourdir la présentation bien qu’elles puissent être très utiles pour un utilisateur de Python. On se concentre ici sur l’importation et l’exportation de données expérimentales qui seront des nombres (entiers ou flottants) directement dans des vecteurs et tableaux numpy.

6. Traiter des données expérimentales avec numpy#

Lorsqu’il y a peu de données expérimentales, on peut les importer “à la main” mais si ces données sont nombreuses, il devient utile de stocker ces données dans un fichier (extension .txt, .dat ou autre) pour les importer dans Python lorsqu’on veut les utiliser. Cela permettra en plus de réutiliser un script Python déjà écrit sur de nouvelles données expérimentales en ne changeant que le nom du fichier.

6.1. Préambule : Répertoire et chemin vers un fichier#

En général les données expérimentales proviendront :

  • d’un système d’acquisition tiers qui a enregistré les données dans un fichier localisé ailleurs sur l’ordinateur. Dans ce cas, il faudra localiser l’endroit où est stocké le fichier : la suite de répertoires et sous-répertoires dans lequel se trouve le fichier, c’est-à-dire le chemin vers ce fichier.

  • d’un fichier partagé par l’enseignant ou par des camarades. Il faudra en général le télécharger sur votre ordinateur (ou celui du TP) en choisissant correctement le répertoire de destination (il est conseillé de le déplacé dans le même répertoire que le fichier contenant votre script).

Dans tous les cas, Python n’est pas censé connaître où est le fichier de données, il faudra donc lui donner le chemin d’accès au fichier.

6.1.1. Chemin absolu#

Si vous avez déjà utilisé un explorateur de fichier, vous avez peut-être remarqué qu’en remontant d’un dossier parent à un autre on finit par arrive à un répertoire racine (C:/ sous Windows et / ou le nom de l’ordinateur sous MacOs et Linux). On peut ainsi localiser un fichier par la succession de répértoire dans lesquels il est inclus depuis ce répertoire racine, on parle de chemin absolu.

Exemple sous Windows : Si vous créez un fichier exercice.py dans le répertoire python_prepa que nous vous avons conseillé de créer. Il est situé dans la succession de répertoire (sous Windows) Users > nom_utilisateur > Documents > python_prepa (nom_utilisateur est à remplacer par le nom que vous avez choisi à la création de votre compte sur votre ordinateur). On note alors le chemin absolu vers le fichier : C:/Users/nom_utilisateur/Documents/python_prepa/exercice.py

Exemple sous MacOS et Linux : Si vous créez un fichier exercice.py dans le répertoire python_prepa que nous vous avons conseillé de créer. Il est situé dans la succession de répertoire (sous MacOs ou Linux) home > nom_utilisateur > python_prepa (nom_utilisateur est à remplacer par le nom que vous avez choisi à la création de votre compte sur votre ordinateur). On note alors le chemin absolu vers le fichier : /home/nom_utilisateur/python_prepa/exercice.py

6.1.2. Chemin relatif#

Les chemins absolus sont pratiques car ils ne souffrent d’aucune ambiguité. Il ont par contre le défaut d’être long et nécessite la connaissance du chemin complet (logique !). Il est souvent pratique d’utiliser uniquement le chemin depuis le fichier qu’on est en train d’utiliser. On parle de chemin relatif.

Exemple : On utilise le fichier exercice.py précédent mais on a besoin de données expérimentales situées dans le fichier /home/nom_utilisateur/python_prepa/donnees/data.txt. Pour “passer” du répertoire de exercice.py au répertoire de data.txt, il suffit simplement d’entrer dans le répertoire donnees. Le chemin relatif de exercice.py vers data.txt est alors : donnees/data.txt On remarquera l’absence de C:/ ou / au début qui signifie qu’il s’agit d’un chemin relatif.

La plupart du temps, l’utilisation de chemin relatif sera préfèrée.

Note

Il arrive qu’on doivent remonter d’un répertoire, on utilise alors ..

Exemple : le chemin relatif de data.txt vers exercice.py est ../exercice.py

6.1.3. os.chdir#

Il existe un module os dans l’une des fonctions chdir(path:string) permet de définir le répertoire de travail de Python pour la suite du script. C’est dans le répertoire de travail que Python va, par défaut recherche les fichiers que l’on veut importer. Il est vivement conseillé, lorsqu’on travaille avec des fichiers de données de définir un répertoire de travail.

Exemple : Ouverture du fichier donnees.txt situé dans le répertoire C:/Users/nom_utilisateur/Documents/python_prepa/

from os import chdir  # Importation de chdir
chdir("C:/Users/nom_utilisateur/Documents/python_prepa/")  # Le nom de repertoire doit être une chaine de caractère

open("donnees.txt", 'r')  # Exemple de façon d' 'ouvrir un fichier (non expliqué ici)

6.2. Préparer l’importation#

Avant d’importer un fichier de données, il est important :

  • de le localiser (cf. supra)

  • de l’ouvrir pour regarder la forme du fichier (pyzo permet en général d’ouvrir un fichier texte contenant des données)

Un fichier de données expérimentales contient en général :

  1. (Facultatif) un en-tête décrivant les données expérimentales recueillies (expérience réalisée et conditions expérimentales, date, …)

  2. Un tableau de valeurs avec

    • une ligne (ou plusieurs) d’en-tête donnant les grandeurs mesurées et leur unité

    • des lignes contenant les données expérimentales

    • sur une ligne, chaque donnée (chaque “colonne”) est séparée par un séparateur (, ou ;)

Pour préparer l’importation, il est important de vérifier le nombre de lignes de commentaires (elles ne seront pas importées), la ligne titre qui donne l’ordre des grandeurs mesurées, l’unité… et le séparateur utilisé. Dans l’exemple ci-après, on observe :

  • 6 lignes de commentaires et une ligne d’en-tête

  • les mesures dans l’ordre : Température en Kelvin, Pression en bar, Volume en \(cm^3\) puis un entier représentant l’état du système (Liquide, Gaz, Liquide+Gaz, Fluide supercritique).

  • Une séparation des colonnes par des ,

../_images/fichier_donnees.png

Fig. 6.1 Exemple de fichier de données affichés dans Pyzo#

6.3. Importation dans Python#

6.3.1. Syntaxe#

La bibliothèque numpy propose la fonction loadtxt qui permet d’importer des données numériques dans un tableau numpy. Sa signature est :

loadtxt('chemin_vers_fichier', skiprows=3, delimiter=',', usecols=(0, 1, 4), unpack=False)

Il renvoie un tableau numpy.

  • 'chemin_vers_fichier' est une chaine de caractère (entre "" donc) donnant le chemin (relatif ou absolu) vers le fichier à lire

  • skiprows=3 donne le nombre de ligne au début du fichier à sauter (commentaires et ligne de titre)

  • delimiter=',' est le caractère (ne pas oublier les ''autour de la virgule) qui sépare les colonnes dans le fichier de données.

  • usecols=(0, 1, 4) indique les colonnes à importer. Cet argument est optionnel, si rien n’est donné, toutes les colonnes sont importées.

  • unpack: (Optionnel).

    • False (par défaut), la fonction renvoie les données sous forme de tableau numpy avec la même structure que dans le fichier.

    • True, renvoie les données sous plusieurs variables (vecteurs numpy) et chaque variable contient une colonne

  • D’autres arguments optionnels existent mais ils ont moins d’utilité.

Attention

L’importation ne pourra fonctionner que si le tableau de données expérimentales est bien formé, c’est-à-dire si chaque ligne de données possède le même nombre de colonnes.

6.3.2. Exemple#

Le script suivant est dans un fichier. Les données précédentes sont situées dans le fichier Sf6/sf6.dat.

C’est un chemin…

… relatif par rapport au fichier où se trouve le script. On se permet donc de ne pas utiliser chdir.

import numpy as np  # On n'oublie pas d'importer numpy

nom_fichier = "Sf6/sf6.dat"  # Bien penser aux "" car ce doit être une chaine de caractère

"""Importation complète sous forme de tableau"""
datas1 = np.loadtxt(nom_fichier, skiprows=7, delimiter=',')  # Il y a bien 6 lignes de commentaires et une ligne de titre.
print("Tableau complet : ")
print(datas1)  # Le tableau étant volumineux, Python n'en affiche qu'une partie.

print("Première colonne du tableau :")
print(datas1[:, 0])  # On peut extraire une colonne, ici la colonne des températures.


"""Importation complète avec un vecteur par colonne"""
T, P, V, Etat = np.loadtxt(nom_fichier, skiprows=7, delimiter=',', unpack=True)  # On récupère ainsi des vecteurs séparés

print("Vecteur de pressions :")
print(P)  # Vecteur des données de Pression en bar


"""Importation partielle d'une colonne
Il est déconseillé, pour des raison d'efficacité d'importer une à une les colonnes si vous les voulez toutes.
"""
V1 = np.loadtxt(nom_fichier, skiprows=7, delimiter=',', usecols=2)  # On importe la colonne d'indice 2, soit les volumes

print("Vecteur des volumes :")
print(V1)  # Vecteur de données de Volume en m^3
Tableau complet : 
[[15.1    7.5    4.     0.   ]
 [15.1    7.75   3.8    0.   ]
 [15.1    8.     3.6    0.   ]
 ...
 [45.6   38.5    0.25   3.   ]
 [45.6   39.75   0.2    3.   ]
 [45.6   44.     0.175  3.   ]]
Première colonne du tableau :
[15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1
 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1
 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 15.1 20.1 20.1 20.1 20.1 20.1
 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1
 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1 20.1
 20.1 20.1 20.1 20.1 20.1 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8
 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8
 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8 24.8
 24.8 24.8 24.8 30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.
 30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.
 30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.  30.
 30.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.
 35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.
 35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.  35.
 35.  35.  35.  35.  35.  40.  40.  40.  40.  40.  40.  40.  40.  40.
 40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.
 40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.  40.
 40.  40.  40.  40.  40.  40.  40.  40.  40.  45.6 45.6 45.6 45.6 45.6
 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6
 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6
 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6 45.6
 45.6 45.6]
Vecteur de pressions :
[ 7.5   7.75  8.    8.5   9.    9.5   9.75 10.   10.5  11.   11.5  12.
 12.5  13.   13.5  14.   14.5  15.   15.5  16.   16.5  17.   17.5  18.
 18.5  19.   19.   19.   19.1  19.1  19.1  19.1  19.1  19.25 19.5  20.
 39.    7.5   8.    8.5   9.    9.5  10.   10.5  11.   11.5  12.   12.5
 13.   13.5  14.   14.5  15.   15.5  16.   16.5  17.   17.5  18.   18.5
 19.   19.5  20.   20.5  21.   21.5  21.5  21.5  21.5  21.5  21.5  21.75
 22.   23.   37.    7.75  8.    8.5   9.    9.5  10.   10.5  11.   11.5
 12.   12.5  13.   13.5  14.   14.5  15.   15.5  16.   16.5  17.   17.5
 18.   18.5  19.   19.5  20.   20.5  21.   21.75 22.25 23.   23.5  24.
 24.   24.   24.   24.25 24.5  25.   28.    8.    8.5   9.    9.5  10.
 10.5  11.   11.5  12.   12.5  13.   13.5  14.   14.5  15.   15.5  16.
 16.5  17.   17.5  18.   18.5  19.   19.5  20.   20.5  21.5  22.   22.5
 23.5  24.5  25.   26.   26.75 27.   27.   27.   27.   28.   30.5   8.
  8.5   9.    9.5  10.   10.5  11.   11.5  12.   12.5  13.   13.5  14.
 14.5  15.   15.5  16.   16.5  17.   17.5  18.   18.5  19.   19.5  20.
 21.25 21.5  22.   22.5  23.25 24.   24.5  25.5  26.25 27.25 28.   29.
 29.5  30.25 30.25 30.25 30.5  30.75 31.   31.5  40.    8.5   9.    9.5
 10.   10.5  11.   11.5  12.   12.5  13.   13.5  14.   14.5  15.   15.5
 16.   16.5  17.   17.5  18.   18.5  19.25 20.   20.75 21.5  22.   22.5
 23.25 24.   24.75 25.5  26.25 27.25 28.25 29.   30.   31.   32.   32.75
 33.5  33.5  33.5  33.75 34.   35.   38.    8.5   9.    9.5  10.   10.5
 11.   11.5  12.   12.5  13.   13.5  14.   14.5  15.   15.5  16.   16.5
 17.   17.5  18.   18.5  19.   19.75 20.25 20.75 21.5  22.   22.75 23.25
 24.   24.75 25.5  26.5  27.5  28.5  29.5  30.25 31.5  32.5  33.5  35.
 35.75 36.75 37.5  38.   38.5  38.5  39.75 44.  ]
Vecteur des volumes :
[4.    3.8   3.6   3.4   3.2   3.    2.9   2.8   2.65  2.5   2.35  2.25
 2.15  2.    1.9   1.85  1.75  1.65  1.6   1.5   1.45  1.4   1.35  1.25
 1.2   1.15  1.1   1.    0.9   0.8   0.7   0.6   0.4   0.3   0.2   0.15
 0.125 4.    3.8   3.5   3.25  3.05  2.9   2.75  2.6   2.45  2.35  2.2
 2.1   2.    1.9   1.85  1.75  1.65  1.6   1.55  1.45  1.4   1.35  1.3
 1.25  1.2   1.15  1.1   1.05  1.    0.9   0.8   0.7   0.6   0.4   0.3
 0.2   0.15  0.125 4.    3.8   3.55  3.35  3.15  2.95  2.8   2.65  2.5
 2.4   2.35  2.15  2.05  1.95  1.9   1.8   1.725 1.65  1.6   1.5   1.45
 1.4   1.35  1.3   1.25  1.2   1.15  1.1   1.05  1.    0.95  0.9   0.85
 0.8   0.7   0.6   0.5   0.3   0.2   0.15  3.9   3.65  3.4   3.2   3.1
 2.9   2.75  2.6   2.45  2.35  2.225 2.15  2.05  1.95  1.85  1.8   1.7
 1.65  1.6   1.5   1.45  1.4   1.35  1.3   1.25  1.2   1.15  1.1   1.05
 1.    0.9   0.85  0.8   0.75  0.7   0.6   0.5   0.4   0.2   0.15  4.
 3.75  3.5   3.3   3.1   2.95  2.8   2.65  2.5   2.4   2.3   2.2   2.1
 2.    1.9   1.85  1.75  1.7   1.65  1.575 1.5   1.45  1.4   1.35  1.3
 1.25  1.2   1.15  1.1   1.05  1.    0.95  0.9   0.85  0.8   0.75  0.7
 0.65  0.6   0.5   0.4   0.35  0.25  0.2   0.175 0.15  3.8   3.55  3.35
 3.15  3.    2.95  2.7   2.6   2.45  2.35  2.25  2.15  2.1   2.    1.9
 1.825 1.75  1.7   1.65  1.575 1.5   1.45  1.35  1.3   1.25  1.2   1.15
 1.1   1.05  1.    0.95  0.9   0.85  0.8   0.75  0.7   0.65  0.6   0.55
 0.5   0.4   0.35  0.3   0.25  0.2   0.15  3.95  3.65  3.45  3.25  3.1
 2.95  2.8   2.65  2.5   2.4   2.3   2.2   2.1   2.    1.95  1.875 1.8
 1.75  1.7   1.6   1.55  1.5   1.45  1.4   1.35  1.3   1.25  1.2   1.15
 1.1   1.05  1.    0.95  0.9   0.85  0.8   0.75  0.7   0.65  0.6   0.55
 0.5   0.45  0.4   0.35  0.3   0.25  0.2   0.175]

6.4. Sauvegarder des données depuis Python#

Vous l’utiliserez peut-être moins souvent, mais vous pouvez sauvegarder un tableau numpy dans un fichier avec savetxt de la bibliothèque numpy :

np.savetxt(nom_fichier, tableau_a_sauver, delimiter=',', comments='', header='')
  • comments : Commentaires à ajouter au début du fichier

  • header : Chain de caractère ajoutant une ligne d’en-tête (par exemple "T(K),P(bar),V(m^3)")