• Aucun résultat trouvé

tp_rw January 25, 2021

N/A
N/A
Protected

Academic year: 2022

Partager "tp_rw January 25, 2021"

Copied!
11
0
0

Texte intégral

(1)

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)

(2)

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)

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)

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)

(5)

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 :

(6)

[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)

(7)

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

(8)

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>

(9)

</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 &eacute;l&egrave;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>

(10)

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

&egrave;

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):

(11)

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>

[ ]:

Références

Documents relatifs

A mechanism is needed to allow the sender to transmit this sort of presentational information to the recipient; the Content-Disposition header provides this mechanism,

[r]

et des rides un peu moin creusées on veut de la jeunesse en poudre on veut de la neige en été des grands buildings sous le soleil des monuments pharaonniques on veut partout

Un code pour le cadenas est donc un nombre constitué de 6 chires, chacun d'entre eux provenant d'une des roues. (Les réponses aux questions suivantes devront être précisément

[r]

The study focuses on phonological, orthographical, lexical, syntactical, semantic, pragmatic and tex- tual aspects and reveals the overwhelming influence of French, English and

[r]

[r]