tp_rw
January 25, 2021
[1]: from numpy import average, array, arange#moyenne en numpy, tableaux
1 Création d’un fichier
[2]: #écriture dans le fichier test f = open('test','w')
f.write('toto et titi\n')
f.write('titi et gros minet\n') f.write('un titi, deux titis\n') f.write('une ligne de texte\n') f.close()
[3]: f = open('test','r') print(f.read()) f.close()
toto et titi
titi et gros minet un titi, deux titis une ligne de texte
2 Supprimer
Ecrire une fonction
def removeChaine(nameFile, asup):
"""
Supprime la chaine asup du contenu du fichier de nom nameFile et met le résultat dans un fichier de nom nameFile_out
"""
On peut utiliser split etjoin:
[4]: s = 'un mot; un autre; encore un autre' l = s.split(';')
print(l)
res = '-- xx --'.join(l)
print(res)
['un mot', ' un autre', ' encore un autre']
un mot-- xx -- un autre-- xx -- encore un autre [5]: # ************
def removeChaine(nameFile, asup):
"""
Supprime la chaine asup du contenu du fichier de nom nameFile
"""
fich = open(nameFile,'r')#ouvrir en lecture contenu = fich.read()
fich.close()
t = contenu.split(asup) # le decompose en une liste sans asup fich = open(nameFile+'_out','w')#ouvrir avec écrasement
fich.write(u' '.join(t))#concatener puis écrire fich.close()
[6]: nameFile = 'test'
print ('verification avant modif ') fich = open(nameFile,'r')
contenu = fich.read() print(contenu)
fich.close()
removeChaine('test','titi')
print('verification apres modif ') fich = open(nameFile+'_out','r') contenu = fich.read()
print(contenu) fich.close()
verification avant modif toto et titi
titi et gros minet un titi, deux titis une ligne de texte
verification apres modif toto et
et gros minet un , deux s une ligne de texte
3 Conserver une ligne sur deux
Ecrire une fonctio
def une_sur_deux(nameFile):
"""conserve une ligne sur deux
et met le résultat dans un fichier de nom nameFile_out
"""
[7]: # ****************
def une_sur_deux(nameFile):
i = 0#compteur de ligne
f1 = open(nameFile,'r')#ouvrir en lecture f2 = open(nameFile+'_out','w')#écriture l = f1.readline()
while l:
if i%2==0:
f2.write(l) l=f1.readline() i+=1
f1.close(); f2.close() [8]: nameFile = 'test'
print ('verification avant modif ') fich = open(nameFile,'r')
contenu = fich.read() print(contenu)
fich.close()
une_sur_deux('test')
print('verification apres modif ') fich = open(nameFile+'_out','r') contenu = fich.read()
print(contenu) fich.close()
verification avant modif toto et titi
titi et gros minet un titi, deux titis une ligne de texte
verification apres modif toto et titi
un titi, deux titis
4 Un fichier de notes
Dans un fichier textenotes (créé par exemple avec le bloc-note dans le répertoire courant), écrire Nom : Hoareau; Prénom: Jean;Notes : 10 12 6 13
Nom:Dupont ; Prénom : Pierre ; Notes : 4 8 10.5 2 Notes : 6.5 10 11 12; Prénom : José ; Nom : Para Prénom :Marie; Notes : 20 1 12.5 13 ; Nom : Juana
Il y a un élève par ligne. Le nombre de notes est quelconque mais toujours le même dans chaque ligne.
Le séparateur de champs est le point virgule. Dans un sous-champs, le séparateur est le signe deux points.
L’ordre des champs est quelconque. Dans un sous-champs l’information sur la catégorie précède celle sur la valeur.
Il y a un espace entre chaque note, mais pas forcément d’espace entre les champs ni entre la catégorie, les deux points et la valeur.
4.1 Récupérer les informations Ecrire la fonction
def infos(file):
"""retourne une liste de listes
chaque sous-liste contient le nom, le prénom et la liste des notes d'un élève
"""
[9]: # ***********
def normalize(l):
lc = l.split() return ' '.join(lc)
def notes(s):
ln = s.split()
return [float(n) for n in ln]
def traiter(l):
"""traitement d'une ligne"""
lc = l.split(';')#les champs for c in lc:
nc, vc = c.split(':') if 'Prénom' in nc:
p = normalize(vc) elif 'Nom' in nc :
n = normalize(vc) else :
ln = notes(vc)
return [n,p,ln]
def infos(file):
f = open(file,"r", encoding="utf8") res = []
l = f.readline()# 1ere ligne while l:
res.append(traiter(l))
l = f.readline()#ligne suivante f.close()
return res
[10]: l = "Nom: Dupont; Prénom : Pierre; Notes : 12 13"
l.split(";")
[10]: ['Nom: Dupont', ' Prénom : Pierre', ' Notes : 12 13']
[11]: n = ' Pierre de la Rigolade de \n la Poilade ' sn = n.split()
' '.join(sn)
[11]: 'Pierre de la Rigolade de la Poilade' [12]: e1,e2 = ' Prénom : Pierre'.split(":")
e1,e2
[12]: (' Prénom ', ' Pierre') [13]: e2.split()
[13]: ['Pierre']
[14]: ' 12.0 13'.split()
[14]: ['12.0', '13']
[15]: t = infos('notes') t
[15]: [['Hoareau', 'Jean', [10.0, 12.0, 6.0, 13.0]], ['Dupont', 'Pierre', [4.0, 8.0, 10.5, 2.0]], ['Para', 'José', [6.5, 10.0, 11.0, 12.0]], ['Juana', 'Marie', [20.0, 1.0, 12.5, 13.0]]]
4.2 Moyenne coefficientée
On utilise la fonction averagede numpy :
[16]: from numpy import average
[17]: print(average([10,15]))#tous les coefs égaux
print(round(average([10,15],weights=[1,2]),1))#avec coefs 12.5
13.3
[18]: data = arange(9).reshape((3,3)) print(data)
print(average(data, axis=1, weights=[1,1,1]))#moyenne par ligne print(average(data, axis=0, weights=[1,1,1]))#moyenne par colonne [[0 1 2]
[3 4 5]
[6 7 8]]
[1. 4. 7.]
[3. 4. 5.]
4.3 Moyenne par élève Ecrire la fonction
def moyenne_eleve(t, nom, coefs):
"""
nom : nom de l'élève coefs : coefs des devoirs
t : tableau de la forme de celui retourné par infos('notes')
retourne la moyenne coefficientée de l'élève
"""
[19]: t
[19]: [['Hoareau', 'Jean', [10.0, 12.0, 6.0, 13.0]], ['Dupont', 'Pierre', [4.0, 8.0, 10.5, 2.0]], ['Para', 'José', [6.5, 10.0, 11.0, 12.0]], ['Juana', 'Marie', [20.0, 1.0, 12.5, 13.0]]]
[20]: # **********
def moyenne_eleve(t, nom, coefs):
"""retourne la moyenne coefficientée de l'élève dont le nom est donné
les infos sur cet élève étant contenue dans une liste comme celle retournée␣
,→par
infos('notes')
"""
l = [l for l in t if nom == l[0]][0]
return average(l[2], weights=coefs)
def moyenne_eleve(t, nom, coefs):
"""retourne la moyenne coefficientée de l'élève dont le nom est donné
les infos sur cet élève étant contenue dans une liste comme celle retournée␣
,→par
infos('notes')
"""
r = []#liste des élèves qui portent le nom voulu (à priori :1) for l in t:
if l[0]==nom:
r.append(l) r = r[0]
return average(r[2], weights=coefs) [21]: print(round(moyenne_eleve(infos('notes'),\
'Para',[1,1,2,2]),1))
10.4
4.4 Moyenne par devoir Ecrire la fonction
def moyenne_devoir(t,n):
"""retourne la moyenne de la classe pour le devoir n t est le retour de infos('notes')
"""
On compte les devoirs à partir de 0.
[22]: # **************
def moyenne_devoir(t,n):#mauvaise complexité
m = array([l[2] for l in t])#matrice des notes return average(m, axis=0)[n]
[23]: # ********
def moyenne_devoir(t,n):# bonne version return average([l[2][n] for l in t]) def moyenne_devoir(t,n):# bonne version
dn = []#liste des notes pour DSn for l in t:
dn.append(l[2][n])#de voir n de l return average(dn)
[24]: print(moyenne_devoir(infos('notes'),2)) 10.0
4.5 Moyenne de la classe Ecrire la fonction
def moyenne_classe(t,coefs):
"""prend en paramètre un tableau comme infos('notes') retourne la moyenne des moyennes coefficientées des élèves
"""
[25]: #***************
def moyenne_classe(t,coefs):
lm = [average(l[2],weights=coefs) for l in t]
return average(lm) [26]: t=infos('notes')
print(round(moyenne_classe(t,[1,1,2,2]),2))
9.65
4.6 Sortie dans un fichier html Se documentersur le htmlet sur le CSS.
Recopier dans le bloc-note :
<!DOCTYPE html>
<html>
<head>
<title>Notes</title>
<style>
body {
background-color: linen;
}
th{ color: blue;font-family: "Times New Roman";
font-style: italic;font-size: 20px;}
tr.un{
background-color: yellow;
font-family: serif;
font-size: 14px;
}
tr.deux{ background-color: red;
font-family: serif; font-size: 14px; }
</style>
</head>
<body>
<table border="1" >
<caption>Table des notes</caption>
<tr class ="intro"> <!-- ligne 1 -->
<th> Nom </th> <!-- case 1 -->
<th> DS1 </th> <!-- case 2 -->
<th> DS2 </th> <!-- case 2 -->
<th> DS3 </th> <!-- case 2 -->
<th> DS4 </th> <!-- case 2 -->
<th> Moyenne élève </th> <!-- case 2 -->
</tr>
<tr class="un"> <!-- ligne 2 -->
<td> Dupont </td> <!-- case 1 -->
<td> 4 </td> <!-- case 2 -->
<td> 13 </td>
<td> 8 </td>
<td> 12 </td>
<td> 13 </td>
</tr>
<tr class="deux"> <!-- ligne 2 -->
<td> Durant </td> <!-- case 1 -->
<td> 14 </td> <!-- case 2 -->
<td> 5 </td>
<td> 15.5 </td>
<td> 10 </td>
<td> 13 </td>
</tr>
<tr class="un">
<td> Note classe </td>
<td> 8 </td> <!-- case 2 -->
<td> 9 </td>
<td> 10.5 </td>
<td> 11 </td>
<td> 13 </td>
</tr>
</table>
</body>
</html>
Enregistrer sous le nomnotes.html. Charger dans un navigateur.
Notons que les accents posent des problèmes en html. Le eaccent aigu se note
&eacur;
leeaccent grave se note
è
Une autre solution plus économique en temps est d’insérer, comme le suggère Igor Martayan, la balise suivante
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
dans l’en-tête. Le début de document devient donc :
<head>
<title>Notes</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Et vous pouvez alors utiliser tous les accents que vous voulez.
4.6.1 Ecrire la fonction
def infos2html(entree, sortie, coefs):
"""écrit un fichier html sur le modèle donné en exemple"""
Dans l’archiveicivous trouverez le fichier d’en-tête et un exemple de sortie souhaitée. On donne en paramètre le nom du fichier de notes et on récupère un fichier sortie.htmltel que contenu dans l’archive.
[27]: t = infos('notes') t
[27]: [['Hoareau', 'Jean', [10.0, 12.0, 6.0, 13.0]], ['Dupont', 'Pierre', [4.0, 8.0, 10.5, 2.0]], ['Para', 'José', [6.5, 10.0, 11.0, 12.0]], ['Juana', 'Marie', [20.0, 1.0, 12.5, 13.0]]]
On doit obtenir un fichier commeici [31]: def traitement_eleve(e,t,coefs,c):
n = len(e[2])
d='<tr class=\"{}\">'.format(c) d+='<td>'+e[0]+'</td>'
for i in range(n):
d+='<td>'+str(e[2][i])+'</td>'
d+='<td>'+str(round(moyenne_eleve(t,e[0],coefs),2))+\
'</td></tr>\n' return d
def traitement_classe(t,coefs,c):
n = len(t[0][2])
d='<tr class=\"{}\">'.format(c) d+='<td>Classe</td>'
for i in range(n):
d+='<td>'+str(round(moyenne_devoir(t,i),1))+'</td>' d2='<td>'+str(round(moyenne_classe(t,coefs),2))+\
'</td></tr>\n' return d+d2
On met l’en-tête dans un fichier [32]: def infos2html2(e,s,coefs):
t=infos(e)
f= open('entete.html','r') debut=f.read()
#print(debut) f.close()
f = open(s,'w') f.write(debut+'\n') c="un"
for e in t:
f.write(traitement_eleve(e,t,coefs,c)) c = "deux" if c=="un" else "un"
f.write(traitement_classe(t,coefs,c)) end = '</table></body></html>'
f.write(end) f.close()
[34]: infos2html2('notes', 'sortie.html',[1,1,2,2])
<td>9.65</td></tr>
[ ]: