Sauvegarde de données avec Python et le module csv

CSV, ou Comma-separated values, est un format informatique ouvert représentant des données tabulaires sous forme de valeurs séparées par des virgules. (Définition de Wikipédia). Séparé par des virgules, ou tout autre caractère choisis d’avance en pratique, avec Python. Ce format à l’avantage de stocker des données simplement, sans forcément avoir recours à une base de données tel que sqlite3 par exemple. Les données étant stocké en texte clair, elles sont récupérable par tout autre scripts et langages, par exemple pour générer des graphiques après.

Python offre un module de base simple pour faire cela. L’usage est assez simple et rapide, parfait pour ce qu’on recherche. Le module permet de stocker des tableaux, mais offre une simplicité pour gérer les dictionnaires.

Stocker des tableaux

import csv
#Un tableau: prénom, âge
data = [['paul', 42],
        ['nico', 31],
        ['jack', 22]
       ]
#On écrit dans le fichier
with open('test.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerows(data)
       
#On lit dans le fichier
with open('test.csv', 'r') as f:
    reader = csv.reader(f)
    for i in reader:
        print i

L’utilisation est simple, writerows permet d’écrire le tableau d’un coup dans le fichier, il aurait été possible d’écrire ligne par ligne un tableau avec writerow (sans ‘s’). Le tableau est directement récupéré dans la variable reader, qu’on affiche ligne par ligne avec print i. Sans surprise, à l’exécution, le programme affiche :

$ ./exo.py
['paul', '42']
['nico', '31']
['jack', '22']

Une petite remarque, les chiffres ne sont pas conservé en tant que int, mais restitué en tant que str.

Quant au fichier test.csv, il contient :

$ cat test.csv
paul,42
nico,31
jack,22

Pour écrire dans le fichier ligne par ligne, il faudrait quelque chose comme :

 with open('test.csv', 'w') as f:
    writer = csv.writer(f)
    for item in data:
        writer.writerow(item)

Stocker des dictionnaires

Par comparaison avec ce qui a déjà fait, on prends un dictionnaire similaire.

import csv

data = [{'name': 'paul', 'age': 42},
        {'name': 'nico', 'age': 31},
        {'name': 'jack', 'age': 22}
       ]

with open('test.csv', 'w') as f:
    writer = csv.DictWriter(f, ['name', 'age'])
    writer.writerows(data)

with open('test.csv', 'r') as f:
    reader = csv.DictReader(f, ['name', 'age'])
    for i in reader:
        print i

La sortie sera :

$ ./exo.py  
{'age': '42', 'name': 'paul'}
{'age': '31', 'name': 'nico'}
{'age': '22', 'name': 'jack'}

On remarque que « l’ordre » n’est pas conservé, et que age apparaît avant, l’explication vient du fait que justement les dictionnaires n’ont pas d’ordre.

Le fichier test.csv reste inchangé, et cela parce que l’ordre d’entrée est indiqué par un tableau, et non par un dictionnaire avec la ligne suivante:

writer = csv.DictWriter(f, ['name', 'age'])

Séparateur

Pour changer le séparateur, et prendre autre chose qu’une virgule, puisqu’il pourrait poser conflit dans certains cas par exemple. Il suffit de l’indiquer en paramètre, comme dans l’exemple suivant :

writer = csv.DictWriter(f, ['name', 'age'], delimiter='|')
reader = csv.DictReader(f, ['name', 'age'], delimiter='|')

C’est aussi simple que ça !

CSV est un module vraiment simple à prendre en main, et pouvant dépanner dans bien des cas. Un billet rapide, mais promis, des billets plus complets reviendront bien assez vite.

Vus : 5842
Publié par Nicolas Paris : 149