Indexation de tables (CSV)

Traitement des données en tables

Plan

Les fichiers CSV

Les fichiers CSV sont des fichiers textes dont les données sont séparées les une des autres par un séparateur (; ou , ou tabulation, ou ce que vous voulez). Chaque ligne du fichier contient un jeu de données. On a donc au final des lignes et des colonne définies par le séparateur et les retours à la ligne. De nombreux logiciels permettent d'exporter et importer des fichiers CSV. Ce sont généralement des logiciels de gestion de données. On pourra par exemple exporter des données de mySQL vers un fichier CSV en terminale. Excel (libre officeCal) permettent l'exportation de ses tableaux en fichiers csv, mais aussi l'importation. Le séparateur en France est ; mais ce n'est pas le même dans d'autres pays, ni pour tous les logiciels (soyez vigilants)! Fort heureusement on peut généralement définir le format d'importation/exportation pour tenir compte de ces différences de séparateurs. L'extension des fichiers CSV est .csv Voici un exemple de fichier CSV:

Album;groupe;année;classement
Master of Puppets;totlica;1986;1
Paranoid;Black Sabbath;1970;2
Rage against the machine;Rage against the machine;1992;3
Ride the lightning;Metallica;1984;4
Rust in peace;Megadeth;1990;5
Metallica;Metallica;1991;6
Toxicity;System of a down;2001;7
reign in blood;Slayer;1986;8
the number of the beast;Iron maiden;1982;9
From mars to sirius;Gojira;2005;10
..and justice for all;Metallica;1988;11
Mutter;Rammstein;2001;12
Painkiller;Judas Priest;1990;13
Powerslave;Iron maiden;1984;14
Blawater Park;Opeth;2001;15
												
Notez que la première ligne contient les noms de colonnes que l'on pourrait associer aux clés vues dans les dictionnaires.... On appelle ces noms les descripteurs.

Ouvrir un fichier Csv, le passer en table ou dictionnaire

On peut récupérer les données d'un fichier CSV dans un tableau doublement indéxé: lignes, colonnes. Pour cela on utilise la commande reader de la bibliothèque csv qui retourne une liste de listes.
import csv

#lecture d'un fichier csv,
#creation d'une liste de liste
table=[]
with open('testCSVCopierCollerSite.csv',newline='') as csvfile:
    reader=csv.reader(csvfile,delimiter=';',quotechar='|')
    print(reader)
    for row in reader:          #pour chaque ligne de reader
        print(', '.join(row))  #affiche la liste row (ligne) en utilisant ,
        table.append(row)	#pour séparer chaque élément de la liste row
print(table)
print(table[0][1])  #va afficher 'groupe'

On peut alors facilement manipuler cette table puisque c'est une liste de listes. Autre méthode, on récupère le fichier CSV dans une liste de dictionnaires qui ont tous les mêmes descripteurs avec la commande DictReader de la bibliothèque csv.

A noter que DictReader crée un liste de dictionnaires ordonnés !. Pour ajouter un dictionnaire à une table de ce type il sera donc préférable de créer un dictionnaire ordonné. Pour cela, vous devez importer la bibliothèque collections et taper

dic = collections.OrderedDict(dic)

pour convertir le dictionnaire dic en dictionnaire ordonné.

dico=[] #c'est une liste
csv.register_dialect('myDialect', delimiter=';', quotechar='|')
with open('testCSVCopierCollerSite.csv') as myFile:
    reader = csv.DictReader(myFile, dialect='myDialect')
    for row in reader:  #row est un dictionnaire
        print(row)
        print(row['Album']) #affiche l'élément avec la clé Album seulement
        dico.append(row)	# ajoute le dicitionnaire row à la liste 'dico'
print(dico)

print(dico[0]['Album'])  #va afficher 'Master of Puppets'

A noter l'utilisation de la commande dialect. Cette commande permet de définir le format du fichier CSV, ses séparateurs, le retour à la ligne. En définissant au préalable le "dialect", cela nous évite de le faire à chaque ouverture, enregistrement de fichiers CSV. Voici comment la définir (ps: il faut bien évidement definir le dialect avant de l'utiliser!)

csv.register_dialect('myDialect', delimiter=';', quotechar='|')

Enregistrer un fichier CSV, ajouter une ligne...

Tout comme précédement, on peut enregistrer des tables dans un fichier CSV, ou une liste de dictionnaires. Il faudra veiller à la cohérence des données!

#Créer un fichier csv, séparateur point virgule
#à partir de la table, ligne par ligne    
with open('nomFichierSauvegardeTable1.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=';',quotechar='|', quoting=csv.QUOTE_MINIMAL)
    for element in table:
        writer.writerow(element)

On peut mettre toute la liste directement avec la commande writerows (oui juste un s en plus !)

#Créer un fichier csv, séparateur point virgule
#à partir de la table, d'un seul coup
with open('nomFichierSauvegardeTable2.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=';',quotechar='|', quoting=csv.QUOTE_MINIMAL)
    writer.writerows(table)

Avec les dictionnaires:

#newline='' indispensable sinon saut de ligne a chanque ligne inseree
#les noms des champs doivent correspondre !!
champs=['Album','groupe','année','classement']
with open('nomFichierSauvegardeDico.csv', 'w', newline='') as csvfile:
	writer = csv.DictWriter(csvfile, dialect="myDialect",fieldnames = champs)
	#le fichier objet csvfile est converti en DictWriter objet.
	#avec les champs en argument.
	writer.writeheader()
	#writeheader écrit la ligne des champs dans le fichier de sortie
	writer.writerows(dico)
  # écrit l'ensemble des données

Une autre méthode, la bibliothèque pandas

La bibliothèque pandas va nous permettre d'effectuer plus de tâches sur les fichiers CSV. pour pouvoir utiliser cette bibliothèque, il faudra probablement l'installer. Pour cela ouvrir cmd de windows, se placer dans votre répertoire Python puis lib et taper la commande:

pip install pandas

result = pandas.read_csv('ClasseurMetalPointVirgule.csv',sep=';', encoding='latin-1')

Exercices

  1. Copier coller l'exemple (album, groupes etc) donné plus haut dans un fichier txt (par exemple dans notepad++), bien faire attention à la norme utilisée (choisir utf8). Ouvrir excel et ouvrir ce fichier (faites bien attention au choix du séparateur, de la norme UTF8). Lorsque le fichier s'ouvre correctement, sauvegardez le dans le dossier de vos programmes python au format CSV (Choisissez le séparateur que vous voulez). Tapez un programme python qui affiche le contenu de ce fichier avec les listes de listes puis avec les dicitionnaires.

  2. Compléter le programme précédent pour corriger le nom du groupe 'totolica' en Metallica avec les listes de listes et aussi avec la méthode des dictionnaires, puis sauvegardez dans un nouveau fichier. Ouvrez ce fichier avec un tableur pour vérifier.

  3. Ajouter à la fin un album tout aussi prestigieux de votre choix avec les listes de listes et aussi avec la méthode des dictionnaires, puis sauvegardez dans un nouveau fichier. Ouvrez ce fichier avec un tableur pour vérifier.

  4. Supprimer l'album 'reign in blood' avec les listes de listes et aussi avec la méthode des dictionnaires, puis sauvegardez dans un nouveau fichier. Ouvrez ce fichier avec un tableur pour vérifier.

  5. Demander un nom d'album et dire si cet album est dans le fichier csv. Si oui, afficher les infos qui s'y rapportent, si non, dire "non trouvé".

  6. Ajouter entre 'Ride the lightning' et 'Rust in peace' un album tout aussi prestigieux de votre choix avec les listes de listes et aussi avec la méthode des dictionnaires, puis sauvegardez dans un nouveau fichier. Ouvrez ce fichier avec un tableur pour vérifier.

  7. En utilisant un algorithme de tri de votre choix, ranger dans l'ordre des groupes et sauvegarder.

  8. J'ai chargé sur data.gouv.fr le fichier csv suivant. Télécharger ici. Vous constaterez qu'en double cliquant dessus, il s'ouvre... mais il y a de nombreux soucis. Le fichier au format csv n'est pas bon. Quelle solution proposez vous?

  9. J'ai chargé sur data.sncf.com le fichier csv suivant. Télécharger ici. Vous souhaitez (si si, je vous assure), réaliser un petit site web qui demande le nom d'une gare, un jour et propose les horaires disponibles pour le jour demandé....nous ne pourrons réaliser cela qu'en terminale avec les bases de données et le php...ce ne sera pas très différent. Déçu, vous vous rabattez sur Python et écrivez un programme qui demande la gare et le jour souhaité et affiche les horaires de cette journée. Si vous êtes courageux, ou connaisseur de tkinter, utilisez le pour avoir des menus déroulants pour les gares !




Android

De la programmation pour pc à la programmation pour téléphone.

A finir

Pas eu le temps de tout faire.....