1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import division
# Python 2.7
import csv, codecs, cStringIO
#############################################################################
class Profiltableur(csv.Dialect):
"""Profil de lecture/écriture de fichiers CSV avec des tableurs"""
delimiter = ';'
quotechar = '"'
doublequote = True
skipinitialspace = False
lineterminator = '\r\n'
quoting = csv.QUOTE_MINIMAL
# enregistrement du profil pour lecture/écriture de fichier csv du disque
csv.register_dialect('profiltableur', Profiltableur())
#############################################################################
def lirecsv(fichier, codisk='cp1252'):
"""lit le fichier CSV encodé codisk, et le retourne comme une liste de
listes encodée unicode
"""
# lit le fichier sur disque et le met dans un fichier en ram
fs = cStringIO.StringIO()
with codecs.open(fichier, 'r', codisk) as f:
for ligne in f:
fs.write(ligne.encode('utf-8'))
#lit les lignes csv du fichier en ram et convertit en liste de listes
tableau = []
fs.seek(0) # remet le curseur au début du fichier en ram
for ligne in csv.reader(fs, dialect='profiltableur'):
tableau.append([]) # ajouter une ligne vide
for elem in ligne:
tableau[-1].append(elem.decode('utf-8'))
return tableau
#############################################################################
def ecrirecsv(tableau, fichier, codisk='cp1252'):
"""enregistre la liste de listes (tableau) unicode dans le fichier csv
avec l'encodage codisk
"""
# ouverture du fichier en ram
fs = cStringIO.StringIO()
# écriture de la liste convertie en format csv, dans le fichier en ram
c = csv.writer(fs, dialect='profiltableur')
for liste in tableau:
ligne = []
for elem in liste:
ligne.append(elem.encode('utf-8'))
# conversion de la ligne en liste => ligne en chaine format csv
c.writerow(ligne)
# écriture sur disque du fichier en ram, avec correction d'encodage
fs.seek(0) # remet le curseur au début du fichier en ram
with codecs.open(fichier, 'w', codisk) as f:
for ligne in fs:
f.write(ligne.decode('utf-8')) |
Partager