Vous êtes sur la page 1sur 6

2019-2020 Manipulation des tables NSI première

I Introduction
Une des utilisations principales de l’informatique de nos jours est le traitement de quantités importantes de
données dans des domaines très variés : un site de commerce en ligne peut avoir à gérer des bases données pour
des dizaines de milliers (voire plus) d’articles en vente, de clients, de commandes, un hôpital doit pouvoir accéder
efficacement à tous les détails de traitements de ses patients, etc.
Mais si les logiciels de traitement de base de données sont des programmes hautement spécialisés pour
effectuer ce genre de tâches le plus efficacement possible, il est facile de mettre en œuvre les opérations de base
dans un langage de programmation comme Python.
Nous allons en illustrer quelques-unes.

II Le format csv
Le format csv (pour comma separated values, soit en français valeurs séparées par des virgules) est un format
très pratique pour représenter des données structurées. Dans ce format, chaque ligne représente un
enregistrement et, sur une même ligne, les différents champs de l’enregistrement sont séparés par une virgule
(d’où le nom). En pratique, on peut spécifier le caractère utilisé pour séparer les différents champs et on utilise
fréquemment un point-virgule, une tabulation ou deux points pour cela. Notons enfin que la première ligne d’un tel
fichier est souvent utilisée pour indiquer le nom des différents champs. Dans ce cas, le premier enregistrement
apparaissant en deuxième ligne du fichier.
Dans la suite, nous allons utiliser un fichier nommé pays_monde.csv qui contient quelques données sur les
différents pays du monde. En voici les premières lignes :
PAYS,CAPITALE,CONTINENT,POPULATION
Açores,Ponta Delgada,Europe,245283
Afganistan,Kaboul,Asie,32564342
Afrique du sud,Prétoria,Afrique,54956900
Albanie,Tirana,Europe,3063320
Algérie,Alger,Afrique,41098166
Allemagne,Bonn-Berlin,Europe,82801531

III Importation des données


Une façon de charger un fichier csv en Python est d’utiliser la bibliothèque du même nom. Voici une portion de
code permettant de charger le fichier pays_monde.csv avec des virgules comme délimitations.

1# −∗− coding : utf −8 −∗−


2
3 import csv
4 import codecs
5
6 pays =[]
7
8c s v f i l e=codecs . open ( ’ pays_monde . csv ’ , encoding=’ utf −8 ’ )
9 spamreader = csv . reader ( c s v f i l e , d e l i m i t e r=’ , ’ )
10 f o r row in spamreader :
11 pays . append( row )

Dans ce cas, les résultats sont stockés sous forme d’un tableau de tableau. On a par
exemple : »> pays[0]
[’PAYS’, ’CAPITALE’, ’CONTINENT’, ’POPULATION’]
»> pays[2]
[’Afganistan’, ’Kaboul’, ’Asie’, ’32564342’]
Lycée Pierre Mendès France - 1 -
2019-2020 Manipulation des tables NSI première

On s’aperçoit que lors de la lecture du fichier, la première ligne n’a pas été utilisée comme descriptions des
champs et le enregistrement, concernant Açores, apparaît dans pays[1]. Plus gênant, le lien entre les valeurs du
tableau pays[1] et le nom des enregistrements, contenus dans pays[0], n’est pas direct.
Pour y remédier, nous allons utiliser DictReader qui retourne un dictionnaire pour chaque enregistrement, la
première ligne étant utilisée pour nommer les différents champs.

1 import csv
2 import codecs
3 f i c h i e r=codecs . open ( " pays_monde . csv " , encoding=’ utf −8 ’ )
4 pays=l i s t ( csv . DictReader ( f i c h i e r ) )

Cette fois, on obtient un tableau de p-uplets représentés sous forme de dictionnaire.


»> table[0]
{’CAPITALE’: ’Ponta Delgada’,
’CONTINENT’: ’Europe’,
’PAYS’: ’Açores’,
’POPULATION’: ’245283’}

IV Exploitation des données


Nous allons donner deux types d’utilisation simples des données que l’on vient de charger : tout d’abord, l’inter
rogation des données pour récupérer telle ou telle information, puis le tri des données.

1) Interrogation
On peut traduire en Python des question simples. Par exemple, quels sont les pays situés en
Océanie ? »> [p[’PAYS’] for p in pays if p[’CONTINENT’]==’Océanie’]
[’Etats fédérés de Micronésie’,
’Fidji’,
’Guam’,
’Iles Cook’,
’Iles Mariannes du Nord’,
’Iles Marshall’,
’Iles Palau’,
’Iles Salomon’,
’Kiribati’,
’Nauru’,
’Niue’,
’Nouvelle Calédonie’,
’Polynésie Française’,
’Samoa Orientale’,
’Tonga’,
’Tuvalu’,
’Vanuatu’]

Exercice : Afficher les pays dont le nombre d’habitants est supérieur à 300 000 000.

2) Tri
a) Tri selon un unique critère
On ne peut pas directement trier le tableau pays . . .car cela ne veut rien dire. Il faut indiquer selon quels
critères on veut effectuer ce tri. Pour cela, on appelle la fonction sorted ou la méthode sort avec l’argument
supplémentaire

Lycée Pierre Mendès France - 2 -


2019-2020 Manipulation des tables NSI première

key qui est une fonction renvoyant la valeur utilisée pour le tri. Rappelons que la méthode sort trie la liste en place,
alors que la fonction sorted renvoie une nouvelle liste correspondant la liste trié, la liste initiale étant laissée intacte.
Par exemple, si l’on veut trier les pays par leur population, on doit spécifier la clé ’POPULATION’. Pour cela, on
définit une fonction appropriée :

1 def cle_population (p) :


2 return p [ ’POPULATION’ ]

Ainsi, pour classer les pays par population décroissante, on effectue :


pays.sort(key=cle_population, reverse=True)
Mais un petit problème demeure. Si on récupère les noms du 51ème au 60ème pays ainsi classés, le résultat
est étonnant :
»> [(p[’PAYS’], p[’POPULATION’]) for p in pays[50:60]]
[(’Danemark’, ’5707251’),
(’Groenland’, ’55992’),
(’Surinam’, ’558368’),
(’Myanmar’, ’55622506’),
(’Tanzanie’, ’55155000’),
(’Iles Mariannes du Nord’, ’55144’),
(’Finlande’, ’5499514’),
(’Afrique du sud’, ’54956900’),
(’Slovaquie’, ’5407910’),
(’Cap Vert’, ’538000’)]
On ne s’attend pas à trouver le classement par nombre d’habitants selon cet ordre. La raison est que lors de
l’import, tous les champs sont considérés comme des chaînes de caractères, et le tri utilise l’ordre du dictionnaire.
Ainsi, de même que « aa » arrive avant « b », « 10 » arrive avant « 2 ». Cela apparaît ici en regardant les nombres
qui commencent par 55, puis par 551, par 549, etc.
Pour remédier à cela, on modifie la fonction de clé :

1 def cle_population (p) :


2 return i n t (p [ ’POPULATION’ ] )

On a alors le résultat espéré :


»> [(p[’PAYS’], p[’POPULATION’]) for p in sorted(pays, key=cle_population, reverse=True)[50:60]] [(’Corée du
Nord’, ’24851627’),
(’Australie’, ’24000300’),
(’Caméroun’, ’23739218’),
(’Taïwan’, ’23449287’),
("Côte d’Ivoire", ’22671331’),
(’Madagascar’, ’21842167’),
(’Sri Lanka’, ’20675000’),
(’Niger’, ’20672987’),
(’Roumanie’, ’19942642’),
(’Syrie’, ’18090242’)]

b) Tri selon plusieurs critères


Supposons maintenant que l’on veut trier les pays selon deux critères : tout d’abord le continent, puis le nom du
pays. On peut faire cela en définissant une fonction de clé qui renvoie une paire (continent, pays) :

1 def cle_combinee (p) :


2 return (p [ ’CONTINENT’ ] , p [ ’PAYS’ ] )

Lycée Pierre Mendès France - 3 -


2019-2020 Manipulation des tables NSI première

Ainsi,

1[ ( p [ ’CONTINENT’ ] , p [ ’PAYS’ ] ) f o r p in sorted ( pays , key=cle_combinee ) ]

[(’Afrique’, ’Afrique du sud’),


(’Afrique’, ’Algérie’),
(’Afrique’, ’Angola’),
...,
(’Afrique’, ’Tunisie’),
(’Afrique’, ’Zambie’),
(’Afrique’, ’Zimbabwé’),
(’Amérique du Nord’, ’Anguilla’),
(’Amérique du Nord’, ’Antigua-et-Barbuda’),
(’Amérique du Nord’, ’Aruba’),
...,
(’Amérique du Nord’, ’Trinidad et Tobago’),
(’Amérique du Nord’, ’Turks et Caicos’),
(’Amérique du Nord’, ’USA’),
(’Amérique du Sud’, ’Argentine’),
(’Amérique du Sud’, ’Bolivie’),
(’Amérique du Sud’, ’Brésil’),
...,
(’Amérique du Sud’, ’Uruguay’),
(’Amérique du Sud’, ’Venezuela’),
(’Asie’, ’Afganistan’),
(’Asie’, ’Arabie Saoudite’),
(’Asie’, ’Bahrein’),
...,
(’Asie’, ’Vietnam’),
(’Asie’, ’Yemen’),
(’Australie’, ’Australie’),
(’Australie’, ’Nouvelle Zélande’),
(’Europe’, ’Albanie’),
(’Europe’, ’Allemagne’),
...,
(’Europe’, ’Ukraine’),
(’Europe’, ’Vatican’),
(’Océanie’, ’Etats fédérés de Micronésie’),
(’Océanie’, ’Fidji’),
(’Océanie’, ’Guam’),
(’Océanie’, ’Iles Cook’),
...,
(’Océanie’, ’Tonga’),
(’Océanie’, ’Tuvalu’),
(’Océanie’, ’Vanuatu’)]
Cependant, dans ce tri, les deux critères ont été utilisés pour un ordre croissant. Supposons maintenant que
l’on veuille trier les pays par continent et, pour chaque continent, avoir les pays par population décroissante. La
méthode précédente n’est pas applicable, car on a utilisé une unique clé (composée de deux éléments) pour un tri
croissant. À la place, nous allons procéder en deux étapes :
1. trier tous les pays par populations décroissantes ;
2. trier ensuite le tableau obtenu par continents croissants.

Lycée Pierre Mendès France - 4 -


2019-2020 Manipulation des tables NSI première

Ainsi :

1 def cle_continent (p) :


2 return p [ ’CONTINENT’ ]

»> [(p[’PAYS’], p[’CONTINENT’], p[’POPULATION’]) for p in pays]


[(’Nigéria’, ’Afrique’, ’198944618’),
(’Ethiopie’, ’Afrique’, ’102374044’),
(’Egypte’, ’Afrique’, ’90416900’),
...,
(’Seychelles’, ’Afrique’, ’94677’),
(’USA’, ’Amérique du Nord’, ’333516432’),
(’Mexique’, ’Amérique du Nord’, ’123576023’),
...,
(’Anguilla’, ’Amérique du Nord’, ’17087’),
(’Brésil’, ’Amérique du Sud’, ’206977000’),
(’Colombie’, ’Amérique du Sud’, ’48529500’),
...,
(’Guyane Française’, ’Amérique du Sud’, ’268700’),
(’Iles Falkland’, ’Amérique du Sud’, ’3198’),
(’Chine’, ’Asie’, ’1408089559’),
(’Inde’, ’Asie’, ’1386249417’),
...
(’Maldives’, ’Asie’, ’417492’),
(’Australie’, ’Australie’, ’24000300’),
(’Nouvelle Zélande’, ’Australie’, ’4661320’),
(’Allemagne’, ’Europe’, ’82801531’),
(’Turquie’, ’Europe’, ’82801420’),
...,
(’Vatican’, ’Europe’, ’1024’),
(’Fidji’, ’Océanie’, ’898760’),
...,
(’Tuvalu’, ’Océanie’, ’11097’),
(’Niue’, ’Océanie’, ’1624’)]
Pour que cela soit possible, la fonction de tri de Python vérifie une propriété très importante : la stabilité. Cela
signifie que lors d’un tri, si plusieurs enregistrement ont la même clé, l’ordre initial des enregistrements est
conservé. Ainsi, si on a trié les pays par ordre décroissant de population puis par continent, les pays d’un même
continent seront regroupés en conservant l’ordre précédent, ici la population décroissante.
Lycée Pierre Mendès France - 5 -

Vous aimerez peut-être aussi