xxxxxxxxxx
# Tables - fusion voitures
L'exécution de la cellule de code ci-dessous permet d'ouvrir un fichier CSV et d'en transférer le contenu dans deux tables :
- `table_proprietaires` contient des enregistrements qui donnent les identités des propriétaires de véhicules identifiés grâce à leur VIN (Vehicle Identification Number),
- `table_voitures` contient des enregistrements qui permettent d'identifier visuellement des véhicules identifiés grâce à leur VIN.
On sait par ailleurs que **tous les VIN figurant dans `table_voitures` figurent aussi dans `table_proprietaires`**.
L'exécution de la cellule de code ci-dessous permet d'ouvrir un fichier CSV et d'en transférer le contenu dans deux tables :
table_proprietaires
contient des enregistrements qui donnent les identités des propriétaires de véhicules identifiés grâce à leur VIN (Vehicle Identification Number),table_voitures
contient des enregistrements qui permettent d'identifier visuellement des véhicules identifiés grâce à leur VIN.On sait par ailleurs que tous les VIN figurant dans table_voitures
figurent aussi dans table_proprietaires
.
xxxxxxxxxx
import csv
import pandas
def charger_fichier( nom_fic ):
"""
Permet de lire un fichier CSV en utilisant la ligne d'entêtes
Retourne une liste de dictionnaires.
"""
table = []
fichier_csv = open( nom_fic , "r", newline ="", encoding ="utf-8" )
lecteur_fichier = csv.DictReader( fichier_csv , delimiter =",")
for enreg in lecteur_fichier :
table.append (dict ( enreg )) # enreg est de type OrderedDict on le remet endict
fichier_csv.close()
return table
def afficher(table):
f = pandas.DataFrame(table)
return f
table_proprietaires = charger_fichier('./proprietaires.csv')
table_voitures = charger_fichier('./voitures.csv')
xxxxxxxxxx
*Question 1 :*
En étudiant le code ci-dessus, répondre aux questions suivantes :
- Quelle fonction du langage python permet d'ouvrir un fichier ?
- Lors de l'appel de fonction, quel argument indique à python que le fichier est à ouvrir en lecture et pas en écriture ?
- Quel est l'encodage du fichier CSV utilisé : `utf-8` ou `ascii` ou `iso-8859-1`?
- Quel est le séparateur du fichier CSV utilisé : `;` ou `,` ou `:` ?
- Pourquoi est-il important de fermer le fichier une fois qu'on a fini de l'utiliser ?
Question 1 :
En étudiant le code ci-dessus, répondre aux questions suivantes :
Quelle fonction du langage python permet d'ouvrir un fichier ?
Lors de l'appel de fonction, quel argument indique à python que le fichier est à ouvrir en lecture et pas en écriture ?
Quel est l'encodage du fichier CSV utilisé : utf-8
ou ascii
ou iso-8859-1
?
Quel est le séparateur du fichier CSV utilisé : ;
ou ,
ou :
?
Pourquoi est-il important de fermer le fichier une fois qu'on a fini de l'utiliser ?
xxxxxxxxxx
La fonction du langage python qui permet d'ouvrir un fichier est : ...
L'argument qui indique à python que le fichier est à ouvrir en lecture est : ...
L'encodage du fichier CSV utilisé est : ...
Le séparateur du fichier CSV utilisé est : ...
Il est important de fermer le fichier une fois qu'on a fini de l'utiliser ...
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
- La fonction du langage python qui permet d'ouvrir un fichier est : `open`
- L'argument qui indique à python que le fichier est à ouvrir en lecture est : `'r'`
- L'encodage du fichier CSV utilisé est : `'utf-8'`
- Le séparateur du fichier CSV utilisé est : `','`
- Il est important de fermer le fichier une fois qu'on a fini de l'utiliser pour libérer le fichier, c'est à dire pour que les autres applications puissent l'utiliser à leur tour si besoin.
</div>
</details>
La fonction du langage python qui permet d'ouvrir un fichier est : open
L'argument qui indique à python que le fichier est à ouvrir en lecture est : 'r'
L'encodage du fichier CSV utilisé est : 'utf-8'
Le séparateur du fichier CSV utilisé est : ','
Il est important de fermer le fichier une fois qu'on a fini de l'utiliser pour libérer le fichier, c'est à dire pour que les autres applications puissent l'utiliser à leur tour si besoin.
xxxxxxxxxx
*Question 2 :*
En exécutant deux instructions bien choisies, déterminer combien d'*enregistrements* (c-à-d de lignes) contiennent ces tables.
Question 2 :
En exécutant deux instructions bien choisies, déterminer combien d'enregistrements (c-à-d de lignes) contiennent ces tables.
xxxxxxxxxx
...
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
len(table_proprietaires)
```
</div>
</details>
len(table_proprietaires)
xxxxxxxxxx
...
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
```python
len(table_voitures)
```
</div>
</details>
len(table_voitures)
xxxxxxxxxx
<hr style="height:1px;"/>
*Remarque : Pour faciliter l'affichage **des tables**, vous pouvez utiliser la fonction `afficher` :*
Remarque : Pour faciliter l'affichage des tables, vous pouvez utiliser la fonction afficher
:
xxxxxxxxxx
afficher(table_proprietaires)
xxxxxxxxxx
afficher(table_voitures)
xxxxxxxxxx
<hr style="height:1px;"/>
xxxxxxxxxx
*Question 3 :*
Compléter la séquence d'instructions ci-dessous afin de fusionner les deux tables dans une troisième table.
Question 3 :
Compléter la séquence d'instructions ci-dessous afin de fusionner les deux tables dans une troisième table.
xxxxxxxxxx
import copy
table_fusion = []
for voiture in table_voitures:
for proprietaire in table_proprietaires:
if ... :
...
...
...
...
...
...
afficher(table_fusion)
xxxxxxxxxx
<details>
<summary style="border:1pt solid slateblue; border-radius:5pt; width:15%; color:slateblue; padding:3px; background-color: lightcyan"> Solution </summary>
<div style="border:1pt solid slateblue; border-radius:5pt; color:slateblue; padding:3px; background-color: lightcyan">
Première version (on fait une boucle pour ajouter les informations du propriétaire):
```python
import copy #<---- spécifique versions 1 et 2
table_fusion = []
for voiture in table_voitures:
for proprietaire in table_proprietaires:
if proprietaire['vin'] == voiture['vin']:
enregistrement = copy.deepcopy(voiture) #<---- spécifique versions 1 et 2
for key, val in proprietaire.items(): #<---- spécifique version 1
enregistrement[key] = val #<---- spécifique version 1
table_fusion.append(enregistrement)
break
afficher(table_fusion)
```
Seconde version (on ajoute « à la main » les informations du propriétaire):
```python
import copy #<---- spécifique versions 1 et 2
table_fusion = []
for voiture in table_voitures:
for proprietaire in table_proprietaires:
if proprietaire['vin'] == voiture['vin']:
enregistrement = copy.deepcopy(voiture) #<---- spécifique versions 1 et 2
enregistrement['nom'] = proprietaire['nom'] #<---- spécifique versions 2 et 3
enregistrement['ville'] = proprietaire['ville'] #<---- spécifique versions 2 et 3
enregistrement['etat'] = proprietaire['etat'] #<---- spécifique versions 2 et 3
table_fusion.append(enregistrement)
break
afficher(table_fusion)
```
Troisième version (on ajoute « à la main » les informations de la voiture et celles du propriétaire):
```python
table_fusion = []
for voiture in table_voitures:
for proprietaire in table_proprietaires:
if proprietaire['vin'] == voiture['vin']:
enregistrement = dict() #<---- spécifique version 3
enregistrement['vin'] = voiture['vin'] #<---- spécifique version 3
enregistrement['marque'] = voiture['marque'] #<---- spécifique version 3
enregistrement['modele'] = voiture['modele'] #<---- spécifique version 3
enregistrement['annee'] = voiture['annee'] #<---- spécifique version 3
enregistrement['couleur'] = voiture['couleur'] #<---- spécifique version 3
enregistrement['nom'] = proprietaire['nom'] #<---- spécifique versions 2 et 3
enregistrement['ville'] = proprietaire['ville'] #<---- spécifique versions 2 et 3
enregistrement['etat'] = proprietaire['etat'] #<---- spécifique versions 2 et 3
table_fusion.append(enregistrement)
break
afficher(table_fusion)
```
</div>
</details>
Première version (on fait une boucle pour ajouter les informations du propriétaire):
import copy #<---- spécifique versions 1 et 2
table_fusion = []
for voiture in table_voitures:
for proprietaire in table_proprietaires:
if proprietaire['vin'] == voiture['vin']:
enregistrement = copy.deepcopy(voiture) #<---- spécifique versions 1 et 2
for key, val in proprietaire.items(): #<---- spécifique version 1
enregistrement[key] = val #<---- spécifique version 1
table_fusion.append(enregistrement)
break
afficher(table_fusion)
Seconde version (on ajoute « à la main » les informations du propriétaire):
import copy #<---- spécifique versions 1 et 2
table_fusion = []
for voiture in table_voitures:
for proprietaire in table_proprietaires:
if proprietaire['vin'] == voiture['vin']:
enregistrement = copy.deepcopy(voiture) #<---- spécifique versions 1 et 2
enregistrement['nom'] = proprietaire['nom'] #<---- spécifique versions 2 et 3
enregistrement['ville'] = proprietaire['ville'] #<---- spécifique versions 2 et 3
enregistrement['etat'] = proprietaire['etat'] #<---- spécifique versions 2 et 3
table_fusion.append(enregistrement)
break
afficher(table_fusion)
Troisième version (on ajoute « à la main » les informations de la voiture et celles du propriétaire):
table_fusion = []
for voiture in table_voitures:
for proprietaire in table_proprietaires:
if proprietaire['vin'] == voiture['vin']:
enregistrement = dict() #<---- spécifique version 3
enregistrement['vin'] = voiture['vin'] #<---- spécifique version 3
enregistrement['marque'] = voiture['marque'] #<---- spécifique version 3
enregistrement['modele'] = voiture['modele'] #<---- spécifique version 3
enregistrement['annee'] = voiture['annee'] #<---- spécifique version 3
enregistrement['couleur'] = voiture['couleur'] #<---- spécifique version 3
enregistrement['nom'] = proprietaire['nom'] #<---- spécifique versions 2 et 3
enregistrement['ville'] = proprietaire['ville'] #<---- spécifique versions 2 et 3
enregistrement['etat'] = proprietaire['etat'] #<---- spécifique versions 2 et 3
table_fusion.append(enregistrement)
break
afficher(table_fusion)