Aller au contenu

Lecture de fichier

Il est possible de récupérer les données de différents types de fichiers pour les exploiter sous Python.

Parmi les formats d'exportation les plus courants, on retrouve :

  • Excel (.xls et .xlsx)
  • CSV (.csv)
  • Texte brut (.txt)

Attention

Même si deux fichiers ont la même extension, ça ne veut pas dire qu'ils utilisent les mêmes conventions d'écritures. Il est donc parfois nécessaire d'adapter les données pour les rendre exploitables par Python.

Info

Pour les formats texte et CSV, on retrouve comme séparateur de colonnes la virgule ,, le point-virgule ;, la tabulation \t, l'espace ou encore les colonnes peuvent être de largeur fixe.
Il faut donc adapter à chaque fois les fonctions de lecture pour correspondre au fichier.

Attention

Python ne reconnait que le point . comme séparateur des décimales.
Donc si vous rencontrez un fichier avec la convention française d'écriture des nombres, il faudra légèrement adapter le code.

Lire un fichier Excel ou LibreOffice

Il existe deux formats de fichier Excel :

  • .xls qui est l'ancien format d'Excel ;
  • .xlsxqui est le nouveau format d'Excel.

Dans les deux cas, nous allons utiliser le module pandas pour lire les données de ces deux types de fichiers.
pandas utilise comme format de données les DataFrame.

Les différents paramètres de la fonction panda.read_excel(...) sont disponibles ci-dessous :

Paramètre Description
sheet_name Choix de l'onglet à lire.
On peut utiliser un chiffre pour désigner le numéro de l'onglet sheet_name=1 pour le deuxième onglet.
Ou donner le nom de l'onglet sheet_name="Feuil1".
Il est aussi possible de donner un tableau de plusieurs onglets à lire sheet_name=[0,1,"Feuil6"] qui permet de lire le premier onglet, le deuxième ainsi que celui qui s'appel "Feuil6".
header Définit la ligne d'en-tête, par défaut il vaut 0. S'il n'y a pas d'en-tête mettre None
usecols Permet de limiter les colonnes à lire dans le fichier.
On peut utiliser les lettres comme Excel usecols="A:E" ou usecols="A,C:E".
Ou une liste d'entier usecols=(1,2,4).
skiprows Nombre de lignes à sauter à partir du début.
skipfooter Nombre de lignes à sauter à partir de la fin.

Lien vers la documentation pandas.read_excel(...).

Info

Vous pouvez aussi lire les fichiers .odf de LibreOffice avec cette fonction.
Cette fonction gère automatique les conventions d'écritures des nombres. Il n'y a pas de modifications supplémentaires à faire.

Ancien format .xls

Extrait du fichier Data.xls :

png

import pandas as pd

file = r'Data.xls'
data = pd.read_excel(file, sheet_name=0, usecols=(2,3,4))

print(data.head())  # Affichage des premières lignes de la DataFrame
1
2
3
4
5
6
       temps_s  U_moteur_V  I_moteur_A
    0   0.0000    0.003489    1.399715
    1   0.0008    0.003489    1.396759
    2   0.0016   -0.009744    1.390848
    3   0.0024   -0.009744    1.387892
    4   0.0032   -0.009744    1.384936

Nouveau format .xlsx

Extrait du fichier Data2.xlsx :

png

import pandas as pd

file = r'Data2.xlsx'
data = pd.read_excel(file, sheet_name=0, usecols="A,C:E")

print(data.head())  # Affichage des premières lignes de la DataFrame
1
2
3
4
5
6
       X_Value  temps_s  U_moteur_V  I_moteur_A
    0   0.0000   0.0000    0.003489    1.399715
    1   0.0008   0.0008    0.003489    1.396759
    2   0.0016   0.0016   -0.009744    1.390848
    3   0.0024   0.0024   -0.009744    1.387892
    4   0.0032   0.0032   -0.009744    1.384936

Sélection des données et conversion en tableau numpy

Pour faciliter l'utilisation des données, on va les sélectionner une par une et les convertir en tableau numpy.
Pour cela, on affiche les premières lignes pour connaître les données récupérées et on va sélectionner celles qui nous intéressent.

import pandas as pd

file = r'Data.xls'
data = pd.read_excel(file, sheet_name=0, usecols="A,C:E")

print(data.head())  # Affichage des premières lignes de la DataFrame

# On sélectionne la colonne qui porte le nom 'U_moteur_V' et on la convertie en tableau numpy
U_moteur = data['U_moteur_V'].to_numpy()
# De même pour la colonne 'I_moteur_A'
I_moteur = data['I_moteur_A'].to_numpy()

print(U_moteur, "\n", I_moteur)  # Affichage des données extraites
1
2
3
4
5
6
7
8
       X_Value  temps_s  U_moteur_V  I_moteur_A
    0   0.0000   0.0000    0.003489    1.399715
    1   0.0008   0.0008    0.003489    1.396759
    2   0.0016   0.0016   -0.009744    1.390848
    3   0.0024   0.0024   -0.009744    1.387892
    4   0.0032   0.0032   -0.009744    1.384936
    [ 0.003489  0.003489 -0.009744 ...  0.003489  0.003513 -0.009744] 
     [1.399715 1.396759 1.390848 ... 1.387892 1.390848 1.390848]

Fichier CSV et texte avec séparateur

Pour lire les fichiers csv et texte, on utilise la fonction loadtxt(...) du module numpy.
Les paramètres utilisables sont disponibles ci-dessous :

Paramètre Description
dtype Permet de définir le type des données.
delimiter Permet de choisir le délimiteur de colonnes.
skiprows Nombre de lignes à sauter en partant du début.
usecols Liste des colonnes à lire.
max_rows Nombre maximum de lignes à lire.

Documentation complète de la fonction loadtxt.

Lecture du fichier avec convention française

On utilise le fichier Donnees.csv qui contient les données suivantes :

X_Value;1;temps_s;U_moteur_V;I_moteur_A
0;1;0;0,003489;1,399715
0,0008;1;0,0008;0,003489;1,396759
0,0016;1;0,0016;-0,009744;1,390848
0,0024;1;0,0024;-0,009744;1,387892
0,0032;1;0,0032;-0,009744;1,384936
0,004;1;0,004;-0,009744;1,393804
0,0048;1;0,0048;0,003489;1,396759
0,0056;1;0,0056;-0,009744;1,396759
0,0064;1;0,0064;-0,009744;1,390848
0,0072;1;0,0072;-0,009744;1,390848
0,008;1;0,008;0,003513;1,384936
0,0088;1;0,0088;0,003513;1,393804
0,0096;1;0,0096;0,003513;1,393804
0,0104;1;0,0104;-0,009744;1,393804
0,0112;1;0,0112;-0,009744;1,393804
0,012;1;0,012;0,003489;1,390848
0,0128;1;0,0128;0,003489;1,387892
0,0136;1;0,0136;-0,009744;1,390848
0,0144;1;0,0144;0,003489;1,384936
0,0152;1;0,0152;-0,009744;1,381981
0,016;1;0,016;-0,009744;1,376069
0,0168;1;0,0168;-0,009744;1,373113
0,0176;1;0,0176;-0,009744;1,373113
0,0184;1;0,0184;-0,009744;1,373113
0,0192;1;0,0192;0,003489;1,373113
0,02;1;0,02;-0,009744;1,376069
0,0208;1;0,0208;0,003489;1,373113
0,0216;1;0,0216;0,016747;1,373113

Attention

Ici nous avons un fichier avec la convention d'écriture française.

import numpy as np

# Lecture des en-têtes des données avec comme délimiteur le point-virgule
head = np.loadtxt('Donnees.csv', delimiter=';', max_rows=1, dtype=np.str)
# Lecture des données au format str
data = np.loadtxt('Donnees.csv', delimiter=';', skiprows=1, dtype=np.str)
data = np.char.replace(data, ',', '.')

# Affichage des en-têtes
print(head)

# Sélections des données en fonction de l'en-tête et conversion en flottant
t = np.asarray(data[:, np.where(head == 'temps_s')],
               dtype=np.float, order='C').flatten()
U_moteur = np.asarray(
    data[:, np.where(head == 'U_moteur_V')], dtype=np.float, order='C').flatten()
I_moteur = np.asarray(
    data[:, np.where(head == 'I_moteur_A')], dtype=np.float, order='C').flatten()

# Affichage des données
print(t, '\n', U_moteur, '\n', I_moteur)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    ['X_Value' '1' 'temps_s' 'U_moteur_V' 'I_moteur_A']
    [0.     0.0008 0.0016 0.0024 0.0032 0.004  0.0048 0.0056 0.0064 0.0072
     0.008  0.0088 0.0096 0.0104 0.0112 0.012  0.0128 0.0136 0.0144 0.0152
     0.016  0.0168 0.0176 0.0184 0.0192 0.02   0.0208 0.0216] 
     [ 0.003489  0.003489 -0.009744 -0.009744 -0.009744 -0.009744  0.003489
     -0.009744 -0.009744 -0.009744  0.003513  0.003513  0.003513 -0.009744
     -0.009744  0.003489  0.003489 -0.009744  0.003489 -0.009744 -0.009744
     -0.009744 -0.009744 -0.009744  0.003489 -0.009744  0.003489  0.016747] 
     [1.399715 1.396759 1.390848 1.387892 1.384936 1.393804 1.396759 1.396759
     1.390848 1.390848 1.384936 1.393804 1.393804 1.393804 1.393804 1.390848
     1.387892 1.390848 1.384936 1.381981 1.376069 1.373113 1.373113 1.373113
     1.373113 1.376069 1.373113 1.373113]

Lecture du fichier avec convention anglaise

On utilise le fichier Donnees2.csv qui contient les données suivantes :

X_Value;1;temps_s;U_moteur_V;I_moteur_A
0;1;0;0.003489;1.399715
0.0008;1;0.0008;0.003489;1.396759
0.0016;1;0.0016;-0.009744;1.390848
0.0024;1;0.0024;-0.009744;1.387892
0.0032;1;0.0032;-0.009744;1.384936
0.004;1;0.004;-0.009744;1.393804
0.0048;1;0.0048;0.003489;1.396759
0.0056;1;0.0056;-0.009744;1.396759
0.0064;1;0.0064;-0.009744;1.390848
0.0072;1;0.0072;-0.009744;1.390848
0.008;1;0.008;0.003513;1.384936
0.0088;1;0.0088;0.003513;1.393804
0.0096;1;0.0096;0.003513;1.393804
0.0104;1;0.0104;-0.009744;1.393804
0.0112;1;0.0112;-0.009744;1.393804
0.012;1;0.012;0.003489;1.390848
0.0128;1;0.0128;0.003489;1.387892
0.0136;1;0.0136;-0.009744;1.390848
0.0144;1;0.0144;0.003489;1.384936
0.0152;1;0.0152;-0.009744;1.381981
0.016;1;0.016;-0.009744;1.376069
0.0168;1;0.0168;-0.009744;1.373113
0.0176;1;0.0176;-0.009744;1.373113
0.0184;1;0.0184;-0.009744;1.373113
0.0192;1;0.0192;0.003489;1.373113
0.02;1;0.02;-0.009744;1.376069
0.0208;1;0.0208;0.003489;1.373113
0.0216;1;0.0216;0.016747;1.373113
import numpy as np

# Lecture des en-têtes des données avec comme délimiteur le point-virgule
head = np.loadtxt('Donnees2.csv', delimiter=';', max_rows=1, dtype=np.str)
# Lecture des données au format float
data = np.loadtxt('Donnees2.csv', delimiter=';', skiprows=1)

# Affichage des en-têtes
print(head)

# Sélections des données en fonction de l'en-tête et conversion en flottant
t = np.asarray(data[:, np.where(head == 'temps_s')],
               dtype=np.float, order='C').flatten()
U_moteur = np.asarray(
    data[:, np.where(head == 'U_moteur_V')], dtype=np.float, order='C').flatten()
I_moteur = np.asarray(
    data[:, np.where(head == 'I_moteur_A')], dtype=np.float, order='C').flatten()

# Affichage des données
print(t, '\n', U_moteur, '\n', I_moteur)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    ['X_Value' '1' 'temps_s' 'U_moteur_V' 'I_moteur_A']
    [0.     0.0008 0.0016 0.0024 0.0032 0.004  0.0048 0.0056 0.0064 0.0072
     0.008  0.0088 0.0096 0.0104 0.0112 0.012  0.0128 0.0136 0.0144 0.0152
     0.016  0.0168 0.0176 0.0184 0.0192 0.02   0.0208 0.0216] 
     [ 0.003489  0.003489 -0.009744 -0.009744 -0.009744 -0.009744  0.003489
     -0.009744 -0.009744 -0.009744  0.003513  0.003513  0.003513 -0.009744
     -0.009744  0.003489  0.003489 -0.009744  0.003489 -0.009744 -0.009744
     -0.009744 -0.009744 -0.009744  0.003489 -0.009744  0.003489  0.016747] 
     [1.399715 1.396759 1.390848 1.387892 1.384936 1.393804 1.396759 1.396759
     1.390848 1.390848 1.384936 1.393804 1.393804 1.393804 1.393804 1.390848
     1.387892 1.390848 1.384936 1.381981 1.376069 1.373113 1.373113 1.373113
     1.373113 1.376069 1.373113 1.373113]

Lecture fichier texte avec largeur de colonnes fixe

Nous utiliserons cette fois la fonction genfromtxt(...) pour extraire les données.
Documentation complète de la fonction genfromtxt.

Soit le fichier MaxPID.txt sous la forme suivante :

Temps  Consigne  Position  Commande   Courant  Vit. Axe    Moteur
        ms    degrés    degrés     Volts        mA     rad/s     rad/s
         0      89.5      89.6                      0.00         2
        10       6.6      89.5                     -0.16       -64
        24       6.6      88.6                     -0.43      -118
        39       6.6      87.6                     -0.66      -140
        53       6.6      86.5                     -0.82      -164
        67       6.6      85.2                     -0.98      -172
        84       6.6      83.7                     -1.13      -184
        99       6.6      82.3                     -1.24      -184
       113       6.6      80.9                     -1.42      -193
       128       6.6      79.4                     -1.43      -190
       142       6.6      77.8                     -1.53      -200
       156       6.6      76.5                     -1.61      -195
       170       6.6      75.0                     -1.65      -205
       185       6.6      73.3                     -1.71      -198
       199       6.6      71.8                     -1.76      -206
       214       6.6      70.2                     -1.82      -200

Note

La largeur n'étant pas forcément connue à l'avance, il est nécessaire de faire plusieurs essais pour avoir les bonnes données.

import numpy as np

# Lecture des en-têtes des données avec un largeur fixe à 10 caractères
head = np.genfromtxt('MaxPID.txt', delimiter=10, max_rows=1, dtype=np.str)
# Lecture des données au format float
data = np.genfromtxt('MaxPID.txt', delimiter=10, skip_header=2)

print(head)

# Sélections des données en fonction de l'en-tête et conversion en flottant
temps = np.asarray(data[:, np.where(head == '     Temps')],
                   dtype=np.float, order='C').flatten()
position = np.asarray(
    data[:, np.where(head == '  Position')], dtype=np.float, order='C').flatten()

print(temps)
print(position)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    ['     Temps' '  Consigne' '  Position' '  Commande' '   Courant'
     '  Vit. Axe' '    Moteur']
    [  0.  10.  24.  39.  53.  67.  84.  99. 113. 128. 142. 156. 170. 185.
     199. 214. 228. 243. 255. 272. 286. 301. 315. 329. 344. 360. 375. 391.
     404. 420. 435. 449. 464. 480. 495. 510. 526. 541. 557. 572. 586. 599.
     613. 630. 644. 659. 673. 688. 705. 719. 733. 748. 765. 779. 793. 807.
     820. 832. 846. 861. 877. 891. 906. 921. 937. 952. 968. 981. 997.]
    [89.6 89.5 88.6 87.6 86.5 85.2 83.7 82.3 80.9 79.4 77.8 76.5 75.  73.3
     71.8 70.2 68.6 66.8 65.3 63.7 61.8 60.1 58.2 56.7 54.9 52.8 50.9 48.8
     47.1 44.8 42.6 40.7 38.3 35.9 33.5 30.8 28.1 25.5 22.6 19.7 17.  14.5
     11.2  7.8  4.4  2.5  2.5  2.5  2.5  2.5  3.2  4.1  5.3  6.5  7.4  7.5
      7.5  7.3  7.1  6.6  6.1  5.9  5.8  5.9  6.   6.1  6.2  6.3  6.3]

MaxPID

Lors de l'enregistrement des données issues d'une acquisition, le logiciel MaxPid enregistre deux fichiers donc un fichier .txt.
Ce fichier est à colonnes à largeur fixe (exemple MaxPID.txt)

Attention

Par défaut, le logiciel n'enregistre pas l'ensemble de données. Pensez à bien cocher les grandeurs à récupérer.
Par contre, le fichier texte contient l'ensemble des en-têtes même si aucune donnée n'est disponible.

import numpy as np

# Lecture des en-têtes des données avec un largeur fixe à 10 caractères
head = np.genfromtxt('MaxPID.txt', delimiter=10, max_rows=1, dtype=np.str)
unit = np.genfromtxt('MaxPID.txt', delimiter=10, max_rows=1,
                     dtype=np.str, skip_header=1)  # Récupération des unités
# Lecture des données au format float
data = np.genfromtxt('MaxPID.txt', delimiter=10, skip_header=2)

print("En-tête : ", head, '\n')
print("Unité :", unit, '\n')  # Affichage des unités
# Pour identifier les colonnes qui n'on pas de données `nan`
print("Première ligne de données :", data[0], '\n')

# Sélections des données en fonction de l'en-tête et conversion en flottant
temps = np.asarray(data[:, np.where(head == '     Temps')],
                   dtype=np.float, order='C').flatten()
position = np.asarray(
    data[:, np.where(head == '  Position')], dtype=np.float, order='C').flatten()
omega = np.asarray(data[:, np.where(head == '    Moteur')],
                   dtype=np.float, order='C').flatten()

print("Temps :", temps)
print("Position :", position)
print("Vitesse moteur :", omega)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    En-tête :  ['     Temps' '  Consigne' '  Position' '  Commande' '   Courant'
     '  Vit. Axe' '    Moteur'] 

    Unité : ['        ms' '    degrés' '    degrés' '     Volts' '        mA'
     '     rad/s' '     rad/s'] 

    Première ligne de données : [ 0.  89.5 89.6  nan  nan  0.   2. ] 

    Temps : [  0.  10.  24.  39.  53.  67.  84.  99. 113. 128. 142. 156. 170. 185.
     199. 214. 228. 243. 255. 272. 286. 301. 315. 329. 344. 360. 375. 391.
     404. 420. 435. 449. 464. 480. 495. 510. 526. 541. 557. 572. 586. 599.
     613. 630. 644. 659. 673. 688. 705. 719. 733. 748. 765. 779. 793. 807.
     820. 832. 846. 861. 877. 891. 906. 921. 937. 952. 968. 981. 997.]
    Position : [89.6 89.5 88.6 87.6 86.5 85.2 83.7 82.3 80.9 79.4 77.8 76.5 75.  73.3
     71.8 70.2 68.6 66.8 65.3 63.7 61.8 60.1 58.2 56.7 54.9 52.8 50.9 48.8
     47.1 44.8 42.6 40.7 38.3 35.9 33.5 30.8 28.1 25.5 22.6 19.7 17.  14.5
     11.2  7.8  4.4  2.5  2.5  2.5  2.5  2.5  3.2  4.1  5.3  6.5  7.4  7.5
      7.5  7.3  7.1  6.6  6.1  5.9  5.8  5.9  6.   6.1  6.2  6.3  6.3]
    Vitesse moteur : [   2.  -64. -118. -140. -164. -172. -184. -184. -193. -190. -200. -195.
     -205. -198. -206. -200. -208. -201. -210. -205. -213. -208. -215. -211.
     -216. -216. -218. -221. -222. -228. -226. -232. -233. -235. -239. -241.
     -240. -246. -245. -246. -249. -249. -249. -242. -187.  -97.  -22.   18.
       39.   56.   70.   81.   81.   66.   40.   16.   -1.  -16.  -25.  -29.
      -25.   -9.    4.    9.   11.   12.    9.    4.    2.]

Pilote de bateau

Attention

Bien que l'extension du fichier soit en .xls, le format de fichier utilisé est en réalité du CSV avec séparation par tabulation \t.

On utilise le fichier pilote1_ST.xls.

import numpy as np

# Lecture des en-têtes des données avec comme délimiteur le point-virgule
head = np.loadtxt('pilote1_ST.xls', delimiter='\t', max_rows=1, dtype=np.str)
# Lecture des données au format float
data = np.loadtxt('pilote1_ST.xls', delimiter='\t', skiprows=1)

# Affichage des en-têtes
print(head)

# Sélections des données en fonction de l'en-tête et conversion en flottant
t = np.asarray(data[:, np.where(head == 'temps_s')],
               dtype=np.float, order='C').flatten()
U_moteur = np.asarray(
    data[:, np.where(head == 'U_moteur_V')], dtype=np.float, order='C').flatten()
a_barre = np.asarray(data[:, np.where(head == 'a_barre_°')],
                     dtype=np.float, order='C').flatten()

print("Angle de la barre :", a_barre)
1
2
3
4
5
6
    ['X_Value' '1' 'temps_s' 'U_moteur_V' 'I_moteur_A' 'w_moteur_tr/min'
     'C_moteur_Nm' 'q_pompe_l/min' 'p_pompe_MPa' 'x_vérin_mm' 'xth_vérin_mm'
     'V_vérin_mm/s' 'Vth_vérin_mm/s' 'F_vérin_N' 'a_barre_°' 'w_barre_°/s'
     'C_barre_Nm' 'P_élec_W' 'P_méca_W' 'P_hydrau_W' 'P_vérin_W' 'P_barre_W'
     'r_moteur_' 'r_pompe_' 'r_vérin_' 'r_global_' 'Zéro_V' 'Comment']
    Angle de la barre : [-32.01309  -32.01407  -32.01407  ...  34.848846  34.848846  34.847866]

DAE

Le plus simple pour la DAE est de faire un export vers Meca3D.
On se retrouve alors avec un fichier texte à séparateur par espace, mais ayant pour extension .crb

png

Le fichier exp2.CRB se présente alors sous la forme :

251
XY       0.000000   710.697578
XY       0.040000   710.498040
XY       0.080000   710.498040
XY       0.120000   710.098965
XY       0.160000   700.321613
XY       0.200000   672.386323
XY       0.240000   636.269985
...
import numpy as np
import re

# Lecture du fichier
lines = open('exp2.CRB').readlines()
out = []
for l in lines:
    # Suppression des espaces et caractères doublon
    l = re.sub('\s+', ' ', l).strip()
    # Suppression de la chaîne de caractère en début de ligne
    out.append(l.replace("XY ", '') + '\n')
# Extraction des données
data = np.loadtxt(out, delimiter=' ', skiprows=1)

# Affichage de la première ligne pour vérification
print(data[0])

# Sélection des données, les ordonnées correspondent aux colonne 1 à n en fonction des données exportées
abscisse = np.asarray(data[:, 0], dtype=np.float, order='C').flatten()
ordonnee_1 = np.asarray(data[:, 1], dtype=np.float, order='C').flatten()

print(abscisse)
print(ordonnee_1)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    [  0.       710.697578]
    [ 0.    0.04  0.08  0.12  0.16  0.2   0.24  0.28  0.32  0.36  0.4   0.44
      0.48  0.52  0.56  0.6   0.64  0.68  0.72  0.76  0.8   0.84  0.88  0.92
      0.96  1.    1.04  1.08  1.12  1.16  1.2   1.24  1.28  1.32  1.36  1.4
      1.44  1.48  1.52  1.56  1.6   1.64  1.68  1.72  1.76  1.8   1.84  1.88
      1.92  1.96  2.    2.04  2.08  2.12  2.16  2.2   2.24  2.28  2.32  2.36
      2.4   2.44  2.48  2.52  2.56  2.6   2.64  2.68  2.72  2.76  2.8   2.84
      2.88  2.92  2.96  3.    3.04  3.08  3.12  3.16  3.2   3.24  3.28  3.32
      3.36  3.4   3.44  3.48  3.52  3.56  3.6   3.64  3.68  3.72  3.76  3.8
      3.84  3.88  3.92  3.96  4.    4.04  4.08  4.12  4.16  4.2   4.24  4.28
      4.32  4.36  4.4   4.44  4.48  4.52  4.56  4.6   4.64  4.68  4.72  4.76
      4.8   4.84  4.88  4.92  4.96  5.    5.04  5.08  5.12  5.16  5.2   5.24
      5.28  5.32  5.36  5.4   5.44  5.48  5.52  5.56  5.6   5.64  5.68  5.72
      5.76  5.8   5.84  5.88  5.92  5.96  6.    6.04  6.08  6.12  6.16  6.2
      6.24  6.28  6.32  6.36  6.4   6.44  6.48  6.52  6.56  6.6   6.64  6.68
      6.72  6.76  6.8   6.84  6.88  6.92  6.96  7.    7.04  7.08  7.12  7.16
      7.2   7.24  7.28  7.32  7.36  7.4   7.44  7.48  7.52  7.56  7.6   7.64
      7.68  7.72  7.76  7.8   7.84  7.88  7.92  7.96  8.    8.04  8.08  8.12
      8.16  8.2   8.24  8.28  8.32  8.36  8.4   8.44  8.48  8.52  8.56  8.6
      8.64  8.68  8.72  8.76  8.8   8.84  8.88  8.92  8.96  9.    9.04  9.08
      9.12  9.16  9.2   9.24  9.28  9.32  9.36  9.4   9.44  9.48  9.52  9.56
      9.6   9.64  9.68  9.72  9.76  9.8   9.84  9.88  9.92  9.96 10.  ]
    [ 710.697578  710.49804   710.49804   710.098965  700.321613  672.386323
      636.269985  602.348561  568.028062  535.104328  522.134372  513.953323
      505.772274  497.790763  489.609713  482.426353  475.442531  468.059633
      461.474886  456.286904  450.899383  446.908628  442.518796  435.135898
      427.353925  418.574262  409.595062  401.014937  392.035737  383.256075
      374.476412  364.299985  354.123558  344.745282  334.768393  326.387806
      317.408606  307.830792  299.849281  291.86777   283.088107  274.108907
      266.127396  257.946346  250.563448  242.981013  235.598115  231.008746
      226.618914  218.437865  211.054967  201.676691  190.702113  181.1243
      171.746024  162.766823  155.383925  148.200565  141.615818  136.228298
      129.843089  122.659729  114.877755  106.098093   96.719817   88.33923
       78.761416   69.981754   62.19978    56.014109   53.22058    50.427051
       43.443229   35.661255   26.083442   14.51025     0.941681  -13.42504
      -28.589911  -42.956632  -55.926588  -67.100704  -73.68545   -81.8665
      -90.446624  -97.031371 -104.414269 -111.398092 -119.180065 -127.361114
     -136.140777 -144.521364 -151.704724 -155.296404 -158.489009 -164.475142
     -170.261738 -177.046022 -184.229383 -191.213205 -197.598414 -204.981312
     -211.366521 -217.951268 -225.134628 -230.921224 -235.909669 -242.494416
     -247.48286  -252.471305 -257.659287 -262.647732 -268.833403 -275.218612
     -282.002897 -289.984408 -297.965919 -305.548355 -310.736338 -312.931253
     -314.328018 -319.715538 -325.502134 -332.685494 -341.864232 -350.643894
     -361.219397 -372.792588 -383.767167 -395.14082  -405.317247 -412.500607
     -419.883505 -427.066866 -433.85115  -441.234048 -449.415097 -457.396609
     -466.375809 -475.554547 -483.935134 -491.717108 -498.501392 -501.893535
     -506.881979 -513.865802 -522.645464 -532.422816 -542.000629 -551.578443
     -559.759492 -565.745625 -571.931297 -577.518355 -581.708648 -588.093857
     -596.474444 -604.655493 -613.03608  -621.416667 -629.996792 -639.973681
     -649.751032 -658.730233 -668.108509 -677.486784 -685.468296 -693.449807
     -700.832705 -707.217914 -714.002199 -718.591568 -718.990643 -718.192492
     -716.995266 -716.795728 -715.997577 -714.999888 -714.999888 -715.598501
     -714.999888 -714.999888 -715.798039 -714.999888 -715.199426 -715.798039
     -714.999888 -715.598501 -715.598501 -714.80035  -715.598501 -715.398963
     -714.80035  -715.398963 -715.398963 -714.80035  -715.398963 -715.398963
     -714.80035  -715.598501 -715.398963 -714.999888 -715.598501 -714.999888
     -714.999888 -715.598501 -714.999888 -714.999888 -715.798039 -714.999888
     -715.199426 -715.798039 -714.80035  -715.199426 -715.598501 -714.80035
     -715.398963 -715.398963 -714.80035  -715.598501 -715.398963 -714.999888
     -715.598501 -715.199426 -714.999888 -715.398963 -715.199426 -714.999888
     -715.598501 -714.999888 -714.999888 -715.798039 -714.999888 -715.199426
     -715.798039 -714.999888 -715.398963 -715.598501 -714.80035  -715.398963
     -715.598501 -714.80035  -715.398963 -715.398963 -714.80035  -715.598501
     -715.598501 -714.80035  -715.798039 -715.398963 -714.999888]

Meca3D

Un export texte d'une courbe issue de Meca3D, se présente sous la forme suivante (fichier : Meca3D.txt) :

Position relative de SE_Safran<1> / SE_Bati<1>
a1(rad)
Position    a1(rad)     
0.000000 -0.698132
1.000000 -0.684169
2.000000 -0.670206
3.000000 -0.656244
4.000000 -0.642281
...
96.000000 0.642281
97.000000 0.656244
98.000000 0.670206
99.000000 0.684169
100.000000 0.698132

Valeur mini ordonnée    = -0.698132
Valeur maxi ordonnée    = 0.698132

On a donc plusieurs lignes d'en-tête et des lignes de fin en plus. La séparation des colonnes se fait grâce à l'espace.

import numpy as np

# Lecture du fichier
lines = open('Meca3D.txt').readlines()
print(lines[2])  # Affichage de la grandeur exportée et de son unité

# Lecture des données au format float
# On ne lit pas les 3 premières lignes (skiprow=3) ni les trois dernières grâce au slice[:-3]
data = np.loadtxt(lines[:-3], delimiter=' ', skiprows=3)

# Affichage de la première ligne pour vérification
print(data[0])

# Sélection des données
points = np.asarray(data[:, 0], dtype=np.float, order='C').flatten()
valeurs = np.asarray(data[:, 1], dtype=np.float, order='C').flatten()

print(points)
print(valeurs)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    Position    a1(rad)     

    [ 0.       -0.698132]
    [  0.   1.   2.   3.   4.   5.   6.   7.   8.   9.  10.  11.  12.  13.
      14.  15.  16.  17.  18.  19.  20.  21.  22.  23.  24.  25.  26.  27.
      28.  29.  30.  31.  32.  33.  34.  35.  36.  37.  38.  39.  40.  41.
      42.  43.  44.  45.  46.  47.  48.  49.  50.  51.  52.  53.  54.  55.
      56.  57.  58.  59.  60.  61.  62.  63.  64.  65.  66.  67.  68.  69.
      70.  71.  72.  73.  74.  75.  76.  77.  78.  79.  80.  81.  82.  83.
      84.  85.  86.  87.  88.  89.  90.  91.  92.  93.  94.  95.  96.  97.
      98.  99. 100.]
    [-0.698132 -0.684169 -0.670206 -0.656244 -0.642281 -0.628319 -0.614356
     -0.600393 -0.586431 -0.572468 -0.558505 -0.544543 -0.53058  -0.516617
     -0.502655 -0.488692 -0.47473  -0.460767 -0.446804 -0.432842 -0.418879
     -0.404916 -0.390954 -0.376991 -0.363028 -0.349066 -0.335103 -0.321141
     -0.307178 -0.293215 -0.279253 -0.26529  -0.251327 -0.237365 -0.223402
     -0.20944  -0.195477 -0.181514 -0.167552 -0.153589 -0.139626 -0.125664
     -0.111701 -0.097738 -0.083776 -0.069813 -0.055851 -0.041888 -0.027925
     -0.013963  0.        0.013963  0.027925  0.041888  0.055851  0.069813
      0.083776  0.097738  0.111701  0.125664  0.139626  0.153589  0.167552
      0.181514  0.195477  0.20944   0.223402  0.237365  0.251327  0.26529
      0.279253  0.293215  0.307178  0.321141  0.335103  0.349066  0.363028
      0.376991  0.390954  0.404916  0.418879  0.432842  0.446804  0.460767
      0.47473   0.488692  0.502655  0.516617  0.53058   0.544543  0.558505
      0.572468  0.586431  0.600393  0.614356  0.628319  0.642281  0.656244
      0.670206  0.684169  0.698132]