5. Gestion de fichiers sous python#
Marc BUFFAT, dpt mécanique, Université Claude Bernard Lyon 1

%matplotlib inline
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'serif'
rcParams['font.size'] = 14
from IPython.core.display import HTML
from IPython.display import display
from matplotlib import animation
#css_file = 'style.css'
#HTML(open(css_file, "r").read())
5.1. Fichier informatique#
définition (Wikipédia) un fichier informatique est une collection d’informations numériques (séquences d’octets) réunies sous un même nom, enregistrées sur un support de stockage tel qu’un disque dur, un CD-ROM, une clé USB …
En vue de faciliter leur organisation, les fichiers sont disposés dans des systèmes de fichiers qui permettent de placer les fichiers dans des emplacements appelés répertoires ou dossiers eux-mêmes organisés selon le même principe de manière à former une hiérarchie arborescente
Sur le système de l’ordinateur, un fichier est repéré par son nom avec éventuellement une extension et le répertoire dans lequel il se trouve.
En calcul scientifique, on considère 2 types principaux de fichiers:
des fichiers de programmes qui contiennent un code informatique exécutable par l’ordinateur, sous 2 formes principales:
fichiers exécutables qui contiennent un code binaire directement exécutable par le processeur (extension .exe sous windows). Ces programmes ne sont pas modifiables et sont propre à l’ordinateur utilisé (programmes commerciaux ou propriétaires)
fichiers sources qui contiennent le code source du programme dans un langage de programmation (extension .py pour les programmes Python). Ces programmes peuvent être modifiés et être exécuter sur n’importe quel ordinateur.
des fichiers de données qui contiennent des données (data) crées et manipulées par les programmes, sous 2 formes principales:
des fichiers binaires qui contiennent l’information brute, utilisant le codage de l’ordinateur (le plus efficace pour le stockage)
des fichiers textes qui contiennent les données écrites sous forme de lignes de texte (format le plus simple à manipuler)
Dans la suite on ne considérera que les fichiers programmes Python (extension .py) et des fichiers de données textes (extension .dat).
Pour éviter des problèmes de compatibilités entre systèmes informatiques, on choisira des noms de fichiers sans caractères accentués, sans espace ni caractéres spéciaux (autre que . ou _ ou - )
5.2. Fichier de programme (ou script) sous Python#
un fichier contenant un programme Python a par convention une extension .py. Un simple éditeur de texte (notepad sous Windows) suffit pour créer et modifier un programme Python
gedit « voir le site gedit » un éditeur simple et efficace
vim et variante « soir le site vim » un éditeur de référence pour les programmeurs
spyder « voir le site spyder » un environnement de développement Python à la matlab pour les applications scientifiques. Sous Spyder, on utilisera plutôt la console Ipython pour exécuter les programmes, que la console par défaut qui utilise des conventions matlab différentes d’un interpréteur Python classique.
jupyter lab extension jupyter pour un environnement de programmation
5.3. Fichiers de données sous Python#
Comme dans la pluspart des langages informatiques, lire ou écrire dans un fichier, on va associer à un fichier (à son nom) une variable informatique de type file, qui posséde des fonctions (ou méthodes) permettant de lire ou écrire des données dans le fichier.
5.3.1. fonction de lecture/écriture#
ouverture d’un fichier mon_fichier.dat en lecture: f=open(« nom_fichier.dat »,”r”)
ou en écriture: f=open(« nom_fichier.dat »,”w”)
lecture / ecriture (caractères) f.read(n) ou f.readline() f.write(chaine)
lecture / écriture de tableaux (numpy) A=loadtxt(file (ou nom de fichier)) savetxt(file (ou nom de fichier), A)
fermeture du fichier f.close()
attention caractères accentués (codage UTF8) encodage des chaines string.encode ouverture fichier (bytes) open(« mon fichier », »wb »)
5.4. Exemple manipulation de courbes de Lissajous#
Une courbe de Lissajous (d’après le physicien français « Jules Antoine Lissajous ») est une courbe paramétrique du plan dont les composantes sont des fonctions périodiques du paramètre (en général le temps en physique, et que l’on peut observer avec un oscilloscope).
On veut manipuler et tracer les courbes de Lissajous suivantes
Le rapport \(n=\frac{p}{q}\) est le paramètre de la courbe et \(\phi\) le déphasage. Le temps \(T\) de parcours de la courbe est le plus petit commun multiple de \(p\) et \(q\):

5.4.1. Création d’une petite bibliothèque d’application#
lissajous.py : fichier contient des fonctions utiles, et une partie main qui n’est exécutée que si l’on exécute directement le fichier avec un interpréteur python. Cette partie sert en général à tester la bibliothèque.
Cette partie n’est pas exécutée lorsque l’on importe la bibliothèque avec import .
def pgcd(a,b):
def Lissajous(p,q,phi,N):
def LissajousFigure(p,q,phi):
# programme principal (main) du module
if __name__ == "__main__":
# test de la bibliothéque
Attention pour l’utiliser comme bibliothèque, il ne faut écrire aucune instruction python en dehors des fonctions et de la partie main (dans le if)
5.4.2. fichier lissajous.py#
fichier source Python
%%bash --err /dev/null
ls -al lissajous.py
#cat lissajous.py
-rwxrwxr-x 1 buffat buffat 1580 févr. 10 2025 lissajous.py
5.4.3. exécution du programme#
%%bash --err /dev/null
echo "execution avec interpreteur python"
python3 lissajous.py
ls -al lissajous.png
execution avec interpreteur python
-rw-rw-r-- 1 buffat buffat 97884 févr. 10 13:22 lissajous.png
5.4.4. utilisation de Jupyter lab#
5.5. module (ou librairie)#
module fichier contenant des fonctions et des définitions en python (bibliothèque)
nom du module nom du fichier sans l’extension .py
utilisation du module mon_module.py
import mon_module
import mon_module as mn
from mom_module import ma_fonction
from mon_module import *
from lissajous import pgcd,LissajousFigure
print(pgcd(21,9))
LissajousFigure(5,3,np.pi/2)
3
rem si votre bibliothèque n’est pas dans le répertoire courant, il faudra alors spécifier son chemin d’accès (path) (voir documentation Python)
5.5.1. Exemple: écriture de données#
écriture sur fichiers de \(n\) points d’une courbe de Lissajous avec le format suivant
# ligne de commentaire
# n
t0 x0 y0
.......
ti xi yi
.......
tn-1 xn-1 yn-1
5.5.1.1. Programme Python#
import numpy as np
import matplotlib.pyplot as plt
from lissajous import Lissajous
# calcul des points
p=1; q=2;
N=50
t,x,y=Lissajous(p,q,np.pi/2,N)
# mise sur fichier
F=open("lissajous.dat","w")
F.write("# courbe de lissajous avec p=%d q=%d\n"%(p,q))
F.write("# %d\n"%(N))
np.savetxt(F,np.transpose([t,x,y]))
F.close()
%%bash --err /dev/null
ls -al lissajous.dat
cat lissajous.dat
-rw-rw-r-- 1 buffat buffat 3839 févr. 10 13:22 lissajous.dat
# courbe de lissajous avec p=1 q=2
# 50
0.000000000000000000e+00 0.000000000000000000e+00 1.00000000
0000000000e+00
4.081632653061224164e-02 2.536545839095073474e-01 9.917900138232461638e-01
8.16326530
6122448328e-02 4.907175520039378513e-01 9.672948630390294511e-01
1.224489795918367319e-01 6.95682550
6034863826e-01 9.269167573460217469e-01
1.632653061224489666e-01 8.551427630053460849e-01 8.71318704
1233895203e-01
2.040816326530612013e-01 9.586678530366605777e-01 8.014136218679566159e-01
2.44897959
1836734637e-01 9.994862162006878936e-01 7.183493500977276014e-01
2.857142857142856984e-01 9.74927912
1818236193e-01 6.234898018587335944e-01
3.265306122448979331e-01 8.865993063730001067e-01 5.18392568
3105251592e-01
3.673469387755101678e-01 7.402779970753157190e-01 4.047833431223940570e-01
4.08163265
3061224025e-01 5.455349012105490392e-01 2.845275866310327251e-01
4.489795918367346372e-01 3.15108218
0236212671e-01 1.595998950333795963e-01
4.897959183673469274e-01 6.407021998071323055e-02 3.20515775
7165516541e-02
5.306122448979591066e-01 -1.911586287013718743e-01 -9.602302590768126145e-02
5.714285
714285713969e-01 -4.338837391175580094e-01 -2.225209339563142819e-01
6.122448979591835760e-01 -6.482
283953077878635e-01 -3.453650544213070495e-01
6.530612244897958663e-01 -8.201722545969556410e-01 -4.
625382902408350372e-01
6.938775510204081565e-01 -9.384684220497602203e-01 -5.721166601221693293e-01
7.346938775510203357e-01 -9.953791129491981193e-01 -6.723008902613164528e-01
7.755102040816326259e-0
1 -9.871817834144501758e-01 -7.614459583691344235e-01
8.163265306122448051e-01 -9.144126230158128310
e-01 -8.380881048918403797e-01
8.571428571428570953e-01 -7.818314824680299147e-01 -9.009688679024190
350e-01
8.979591836734692745e-01 -5.981105304912169851e-01 -9.490557470106684157e-01
9.3877551020408
15647e-01 -3.752670048793745883e-01 -9.815591569910653291e-01
9.795918367346938549e-01 -1.2787716168
45066350e-01 -9.979453927503363353e-01
1.020408163265306145e+00 1.278771616845061354e-01 -9.97945392
7503363353e-01
1.061224489795918213e+00 3.752670048793733115e-01 -9.815591569910655512e-01
1.1020408
16326530503e+00 5.981105304912150977e-01 -9.490557470106688598e-01
1.142857142857142794e+00 7.818314
824680295816e-01 -9.009688679024192570e-01
1.183673469387755084e+00 9.144126230158122759e-01 -8.3808
81048918410459e-01
1.224489795918367152e+00 9.871817834144499537e-01 -7.614459583691352007e-01
1.265
306122448979442e+00 9.953791129491983414e-01 -6.723008902613174520e-01
1.306122448979591733e+00 9.38
4684220497606644e-01 -5.721166601221699954e-01
1.346938775510204023e+00 8.201722545969559741e-01 -4.
625382902408353702e-01
1.387755102040816313e+00 6.482283953077891958e-01 -3.453650544213082152e-01
1
.428571428571428381e+00 4.338837391175600633e-01 -2.225209339563155031e-01
1.469387755102040671e+00
1.911586287013736507e-01 -9.602302590768251045e-02
1.510204081632652962e+00 -6.407021998071230073e-0
2 3.205157757165480459e-02
1.551020408163265252e+00 -3.151082180236208230e-01 1.595998950333792354e-
01
1.591836734693877320e+00 -5.455349012105463746e-01 2.845275866310311152e-01
1.632653061224489610e
+00 -7.402779970753142758e-01 4.047833431223928913e-01
1.673469387755101900e+00 -8.86599306372999551
6e-01 5.183925683105244930e-01
1.714285714285714191e+00 -9.749279121818235083e-01 6.2348980185873337
23e-01
1.755102040816326481e+00 -9.994862162006878936e-01 7.183493500977270463e-01
1.795918367346938
549e+00 -9.586678530366613549e-01 8.014136218679558388e-01
1.836734693877550839e+00 -8.5514276300534
70841e-01 8.713187041233888541e-01
1.877551020408163129e+00 -6.956825506034870488e-01 9.269167573460
215248e-01
1.918367346938775420e+00 -4.907175520039380734e-01 9.672948630390293401e-01
1.95918367346
9387710e+00 -2.536545839095085686e-01 9.917900138232460527e-01
2.000000000000000000e+00 -4.898587196
589412829e-16 1.000000000000000000e+00
5.5.2. Lecture des données avec loadtxt#
F=open("lissajous.dat","r")
t,x,y =np.loadtxt(F,unpack=True)
F.close()
print("lecture des données taille=",x.shape, y.shape)
# tracer
plt.plot(x,y,lw=2)
lecture des données taille= (50,) (50,)
[<matplotlib.lines.Line2D at 0x7f0434651f00>]
5.6. Entrée Sortie en python#
5.6.1. Lecture au clavier#
lecture au clavier input d’une valeur sans conversion
val = input("message")
ensuite, on doit faire une conversion
val = int(input("entier ="))
print(val,type(val))
chaine = input("chaine =")
print(chaine,type(chaine))
5.6.2. Écriture avec formatage (mise en forme)#
print(chaine%(val1,val2,..))
chaine est une chaîne de caractères contenant des champs %[n][t]
n = entier optionnel spécifiant la largueur (en colonnes) du champ
t spécifie le type du champ: d=entier (décimal), f=réel (float) , e=réel avec exposant, g=réel (format général), s=chaîne (string)
format avec python 3
string.format(var1,var2,..)
où string est une chaine avec des {} pour spécifier la position des variables (pour le formattage on remplace % par : )
i=1425
x=3242.627
ch="chaine"
print(i,x,ch)
1425 3242.627 chaine
print("i={:} {:08d} x: {:6.2f} ={:8.1e} titre={}".format(i,i,x,x,ch))
i=1425 00001425 x: 3242.63 = 3.2e+03 titre=chaine
5.6.3. Fonctions utiles de gestion des fichiers#
# liste des fichiers dans un repertoire
import glob
fichiers = glob.glob('*')
print(fichiers)
['Numpy-Matplotlib.ipynb', 'Programmation_questions.ipynb', 'lissajous.png', 'data', 'Variables.ipynb', 'CalculSymbolique.pdf', 'PenduleDouble.ipynb', 'README.md', 'alunissage.py', 'lissajous.dat', 'Algorithme.ipynb', 'lissajous.py', 'images', 'Introduction_questions.ipynb', 'CalculSymbolique.ipynb', 'mafig.pdf', 'anim_pendule.py', 'HistoriqueInfo.md', 'planetes.dat', 'Introduction2.ipynb', 'StructureDonnees.ipynb', 'caslin.png', 'BasePython.ipynb', 'Cours.ipynb', 'BasePython.md', 'BibliothequeScientifique.ipynb', 'BaseProgrammation.ipynb', 'output_35_0.png', 'periode.png', 'README.anim', 'Fichiers.ipynb', 'serie', 'MGC1061M', '__pycache__', 'PythonOpt.ipynb', 'Pendule.ipynb', 'mabib.py', 'monCR.tex', 'treillis.py', 'Introduction.pdf', 'draw_pendule.py', 'cours.tplx', 'lunar_landing.py', 'Pendule.py', 'Introduction.ipynb', 'Cours.pdf', 'StructureDonnees.pdf', 'Pendule.pdf', 'planete.py', 'HistoriqueInfo.ipynb', 'mafig.png', 'casnonlin.png', 'PythonScientifique.ipynb']