Outils pour utilisateurs

Outils du site


nsi:premiere:csv:modules_csv_et_pandas

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Modules csv et pandas

Fichier csv

Vous disposez d'un fichier worldcities.csv contenant les données sur un ensemble de villes.

csv signifie comma separated values, c'est un fichier où les données sont séparées par des virgules ou des points-virgules.

Le fichier est un simple fichier texte qui ressemble à cela :

city;city_ascii;lat;lng;country;iso2;iso3;admin_name;capital;population;id
Tokyo;Tokyo;35.6850;139.7514;Japan;JP;JPN;Tōkyō;primary;35676000;1392685764
New York;New York;40.6943;-73.9249;United States;US;USA;New York;;19354922.0;1840034016
Mexico City;Mexico City;19.4424;-99.1310;Mexico;MX;MEX;Ciudad de México;primary;19028000;1484247881
...

Si on l'ouvrait avec un éditeur spécialisé comme un tableur, on aurait ce type de mise en forme :

citycity_asciilatlngcountryiso2iso3admin_namecapitalpopulationid
TokyoTokyo35.6850139.7514JapanJPJPNTōkyōprimary356760001392685764
New YorkNew York40.6943-73.9249United StatesUSUSANew York19354922.01840034016
Mexico CityMexico City19.4424-99.1310MexicoMXMEXCiudad de Méxicoprimary190280001484247881

La première ligne est une entête qui sert à préciser le contenu des colonnes.

Nous aimerions ouvrir le fichier et en extraire le contenu sous une forme exploitable.

Commencez par télécharger worldcities.csv dans un dossier. Vous placerez les scripts suivant dans le même dossier.

Sans module

# Fichier city0.py
# Exemple de chargement de fichier csv
# sans module

file = open('worldcities.csv', 'r', encoding='utf8')
contenu = file.read()
file.close()
lines = contenu.split('\n')
items = [line.split(';') for line in lines]

# à titre d'illustration, affichons le résultat :
for i in range(5):
    print(items[i])

Avec l'objet reader du module csv

# Fichier city1.py
# Exemple de chargement de fichier csv avec
# l'objet reader du module csv

import csv
file = open('worldcities.csv', 'r', encoding='utf8')

# csv fourni un objet de type reader
# qui est comme un tête de lecture placée
# sur le fichier

reader = csv.reader(file, delimiter=';')

villes = []
for row in reader:
    villes.append(row)

file.close()


# à titre d'illustration, affichons le résultat :
for i in range(5):
    print(villes[i])
  • On n'a plus besoin de faire la découpe, csv.reader s'en charge,
  • le résultat villes est un tableau de tableau,
  • la ligne d'entête n'est pas vraiment utilisée,
  • si on veut accéder au nom de pays de Tokyo, il faut déjà savoir que Tokyo est à la ligne 1 puis que le nom de pays est à la colonne 4 et demander villes[1][4]. Ce n'est pas tellement pratique.

Avec l'objet DictReader du module csv

# Fichier city2.py
# Exemple de chargement de fichier csv avec
# l'objet DictReader du module csv

import csv
file = open('worldcities.csv', 'r', encoding='utf8')

# csv fourni un objet de type DictReader
# Il fournit presque des dictionnaires

reader = csv.DictReader(file, delimiter=';')

villes = []
for row in reader:
    villes.append(row)

file.close()

# à titre d'illustration, affichons le résultat :
print(villes[0]["country"])
  • Cette fois le résultat est un tableau de dictionnaires (ou presque),
  • la première ligne d'entête est utilisée pour servir de clés aux dictionnaires,
  • si on veut connaître le pays de Tokyo, il suffit de savoir que Tokyo est à la ligne d'indice 0 et de demander villes[0]['country'],
  • si vous affichez le contenu de villes vous constaterez que les items ne sont pas des exactement des dictionnaires. Si cela posait un problème, on pourrait faire une conversion, en ligne 16 : villes.append(dict(row)). Vous pouvez essayer et constater la différence.

Utiliser une fonction de formatage

La version DictReader n'est pas mal mais dans la lecture du fichier, tout est considéré comme du texte. Si nous voulions faire des calculs avec les l’attitude, longitude… c'est gênant.

On pourrait ajouter une fonction chargée de modifier les types.

# Fichier city2_bis.py
# Utilisation d'une fonction de formatage
# pour que les données numériques soient bien reconnues

import csv

def format(item):
    return {
        'city':item['city'],
        'lat':float(item['lat']),
        'lng':float(item['lng']),
        'country':item['country'],
    }

file = open('worldcities.csv', 'r', encoding='utf8')
reader = csv.DictReader(file, delimiter=';')
villes = []
for row in reader:
    villes.append(format(row))
file.close()

# à titre d'illustration, affichons les 5 première lignes :
print(villes[:5])
  • Les données obtenues ont la bonne forme. On peut utiliser les nombres en tant que nombres.
  • On est libre de filtrer certaines colonnes. Dans cet exemple, la fonction format ne prend en compte que 4 colonnes.
  • Certains cas nécessiteront des fonctions plus souples : ici par exemple, la colonne *population* n'est pas toujours convenablement renseignée. On ne peut donc pas se contenter de int(item["population"]).

Avec le module pandas

Il s'agit d'un gros module qui sait faire beaucoup de choses. Ce module est très utilisé par ceux qui font de l'analyse de données. C'est la présence de module très performants comme celui-ci qui font la popularité de Python.

# Fichier city3.py
# Exemple de chargement de fichier csv avec
# le module pandas

import pandas
villes = pandas.read_csv("worldcities.csv", delimiter=";")

C'est tout ! villes n'est pas un tableau. C'est un objet défini par pandas, plus compliqué et plein de fonctionnalités. Voici quelques exemples que vous pouvez entrer en console après exécution du script :

>>> villes.loc[10] # affichage de l'item au rang 10
>>> villes.loc[10]['population'] # population de cette ville.

Notez que populationa été converti en float automatiquement par panda ce que ne faisait pas csv.

>>> villes.nlargest(10, 'population')
>>> villes[villes.city == "Paris"]
>>> villes['population'].describe()

Ceci n'est qu'un aperçu, pandas a beaucoup de fonctionnalités.

nsi/premiere/csv/modules_csv_et_pandas.txt · Dernière modification : de goupillwiki