repl.it
@fduffaud/

NSI-1ere-CSV-Tables-TD2-1

Python

No description

fork
loading
Files
  • main.py
  • jointure1-4.csv
  • jointureLPM.csv
  • livre.csv
  • membre.csv
  • NotesEleves.csv
  • NotesEleves2.csv
  • NotesEleves3.csv
  • NotesEleves4.csv
  • pret.csv
main.py
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#****************************************************************
# CORRECTION DU TD 2 - NSI
# Traitement données en tables / Opérations sur les tables
#****************************************************************

import csv

 
fichier=open("NotesEleves.csv", encoding='utf8')
table=list(csv.DictReader(fichier,delimiter=","))
#print(table)
fichier.close()

#****************************************************************
# I.1. On cherche à sélectionner les \textbf{noms des élèves}.

#****************************************************************
t1=[ligne["Nom"] for ligne in table]
#print('t1 = ',t1)

#****************************************************************
# I.1. On cherche à sélectionner les élèves ayant plus de 10 en anglais.
# Attention il faut convertir les chaines en entiers pour le test

#****************************************************************
t2=[ligne["Nom"] for ligne in table 
                    if float(ligne["Anglais"])>10]
#print('t2 = ',t2)

#****************************************************************
# Exercice 1 : I.3 Projection et sélection
#****************************************************************


# 1. construire un tableau T3 contenant les noms des élèves ayant plus de 18 en Maths et plus de 13 en NSI ;

t3=[{"Nom":ligne["Nom"],"Maths":float(ligne["Maths"])} for ligne in table]
# print('t3 = ',t3)

# 2.  construire un tableau T4 contenant les noms des élèves ayant plus de 10 en Anglais ou plus de 13 en NSI

t4=[{"Nom":ligne["Nom"],"Anglais":float(ligne["Anglais"])*1.1} for ligne in table]
# print('t4 = ',t4)

#****************************************************************
# I.4 Construction d’une nouvelle table

i4a= [ {"Nom":ligne["Nom"],"Maths":float(ligne["Maths"])} 
              for ligne in table ]

i4b= [ {"Nom":ligne["Nom"],"Anglais":float(ligne["Anglais"])*1.1} 
              for ligne in table ]


#****************************************************************
# Exercice 2
# 1. construire un tableau T5 contenant les noms des élèves et les notes en Maths augmentées de 1 points, sans dépasser 20 

T5= [ {"Nom":ligne["Nom"],"Maths":min(float(ligne["Maths"])+1,20)} 
              for ligne in table ]


# 2.  construire un tableau T6 contenant les noms des élèves et une nouvelle clé nommée "Moyenne" de valeur la moyenne des 3 notes

T6= [ {"Nom":ligne["Nom"],"Moyenne" :(float(ligne["Maths"])+float(ligne["NSI"])+float(ligne["Anglais"]))/3} 
              for ligne in table ]

#****************************************************************
# II Trier une table
# II.1 - sorted(tableau)
#****************************************************************

t=['c','a','14','2','1']
tri=sorted(t)

#print(tri) # tri de caractères
#print(t) # t n'est pas modifié

#****************************************************************
# II.2 - Trier des données en fonction d’une clé
#****************************************************************
def nom(ligne):
    return ligne['Nom']

tri_nom=sorted(table,key=nom,reverse=False)
print('tri_nom', tri_nom)

#****************************************************************
# Exercice 3 : tri selon des critères
#****************************************************************
#1 Effectuer un tri selon les notes en Maths.
def maths(ligne):
    return float(ligne['Maths'])

tri_maths=sorted(table,key=maths,reverse=True)
#print(tri_maths)

#2 Effectuer un tri selon les notes en NSI.
def NSI(ligne):
    return float(ligne['NSI'])

tri_nsi=sorted(table,key=NSI,reverse=True)
# print(tri_nsi)

#3 Effectuer un tri selon les notes en Anglais.
def anglais(ligne):
    return float(ligne['Anglais'])

tri_anglais=sorted(table,key=anglais,reverse=True)
#print(tri_anglais)

# III jointure et fusion
# III.1. réunion de tables
# Etape 1 : création du fichier CSV NotesEleves2.csv
# Etape 2 : importation  
fichier=open("NotesEleves.csv", encoding='utf8')
table1=list(csv.DictReader(fichier))
fichier.close()
#  
fichier=open("NotesEleves2.csv", encoding='utf8')
table2=list(csv.DictReader(fichier))
fichier.close()
# Etape 3 : Fusionner les deux dans une table3  
table3=table1+table2
# Etape 4 : Exporter les données de la table3 dans NotesEleves3.csv
with open("NotesEleves3.csv","w") as sortie:
        objet=csv.DictWriter(sortie,['Nom','Maths','NSI','Anglais'])
        # Pour écrire la ligne d'en têtes
        objet.writeheader()
        # On peut donner la table directement    
        objet.writerows(table3)    

#***************************************************************************
# III.2 Fusions (jointures) de deux tables
#***************************************************************************
fichier=open("NotesEleves.csv", encoding='utf8')
table1=list(csv.DictReader(fichier,delimiter=","))
fichier.close()
#  
fichier=open("NotesEleves4.csv", encoding='utf8')
table4=list(csv.DictReader(fichier,delimiter=","))
fichier.close()
# Etape 3
def fusion(ligneA,ligneB):
    '''In : ligneA la table 1 et ligneB de la table 4  
       Out : le dictionnaire fusion'''
    return {"Nom":ligneA["Nom"],"Prénom":ligneB["Prénom"],"année":ligneB["Année"],"e-mail":ligneB["e-mail"],"Maths":ligneA["Maths"],"NSI":ligneA["NSI"],"Anglais":ligneA["Anglais"]}
# Etape 4a
jointure1=[]
for ligneA in table1:
    for ligneB in table4:
        if ligneA["Nom"]==ligneB["Nom"]:
            jointure1.append(fusion(ligneA,ligneB))
#print(jointure1)

# Etape 4b
jointure2=[fusion(ligneA,ligneB) for ligneA in table1 for ligneB in table4
                                 if ligneA["Nom"]==ligneB["Nom"]]

#print(jointure2)



with open("jointure1-4.csv","w") as sortie:
        objet=csv.DictWriter(sortie,["Nom" ,"Prénom" ,"année" ,"e-mail" ,"Maths" ,"NSI" ,"Anglais" ])
        # Pour écrire la ligne d'en têtes
        objet.writeheader()
        # On peut donner la table directement    
        objet.writerows(jointure1)

#****************************************************************************
# Exercice 4
#****************************************************************************
# question 3
fichier=open("membre.csv", encoding='utf8')
membre=list(csv.DictReader(fichier,delimiter=","))
fichier.close
fichier=open("pret.csv", encoding='utf8')
pret=list(csv.DictReader(fichier,delimiter=","))
fichier.close
fichier=open("livre.csv", encoding='utf8')
livre=list(csv.DictReader(fichier,delimiter=","))
fichier.close
# calcul des jointures
jointure_membre_pret=[{"prénom" : m["prénom"],"idm":m["idm"],"idl":p["idl"]}
                       for m in membre for p in pret
                       if m["idm"]==p["idm"] ]
jointure_livre_pret=[{"titre" : l["titre"],"idm":p["idm"],"idl":p["idl"]}
                       for l in livre for p in pret
                       if l["idl"]==p["idl"] ]
jointure_livre_pret_membre=[{"prénom" : m["prénom"],"idm":m["idm"],"idl":p["idl"],                                  "titre" : l["titre"]}
                       for m in membre for p in pret for l in livre
                       if m["idm"]==p["idm"] 
                       and l["idl"]==p["idl"] ]     
print(jointure_livre_pret_membre)      
sortie=open("jointureLPM.csv","w") 
objet=csv.DictWriter(sortie,['prénom','idm','idl','titre'])
# Pour écrire la ligne d'en têtes
objet.writeheader()
# On peut donner la table directement    
objet.writerows(jointure_livre_pret_membre)      
sortie.close()     
#****************************************************************************
# projets avec fichiers de https://www.data.gouv.fr/fr/datasets/?page=3
#****************************************************************************
Fetching token
?