43 votes

Bibliothèque csv Python avec support Unicode / UTF-8 qui "fonctionne"

Le csv module en Python ne fonctionne pas correctement lorsqu'il y a de l'UTF-8/Unicode impliqués. J'ai trouvé dans la documentation Python (http://docs.python.org/library/csv.html) et les autres pages du site des extraits de ce travail pour des cas spécifiques, mais vous devez bien comprendre de quoi l'encodage vous êtes à la manipulation et à l'utilisation de l'destinées extrait.

Est-il une bibliothèque universelle ou fragment de code Python (2.6) que les écritures/lectures des cordes ou des chaînes unicode à partir .les fichiers csv qui fonctionne, tout simplement? Ou est-ce Python (2.6) liées et il n'y a pas de solution simple?

52voto

Maxim Yegorushkin Points 29380

Le code d'exemple de la façon de lire Unicode donné à http://docs.python.org/library/csv.html#examples semble être obsolète, car il ne fonctionne pas avec Python 2.6 et 2.7.

Voici UnicodeDictReader qui fonctionne avec de l'utf-8 et peut-être avec d'autres codages, mais je ne l'ai testé sur utf-8 entrées.

L'idée est de décoder Unicode uniquement après un csv ligne a été divisé en champs, en csv.reader.

class UnicodeCsvReader(object):
    def __init__(self, f, encoding="utf-8", **kwargs):
        self.csv_reader = csv.reader(f, **kwargs)
        self.encoding = encoding

    def __iter__(self):
        return self

    def next(self):
        # read and split the csv row into fields
        row = self.csv_reader.next() 
        # now decode
        return [unicode(cell, self.encoding) for cell in row]

    @property
    def line_num(self):
        return self.csv_reader.line_num

class UnicodeDictReader(csv.DictReader):
    def __init__(self, f, encoding="utf-8", fieldnames=None, **kwds):
        csv.DictReader.__init__(self, f, fieldnames=fieldnames, **kwds)
        self.reader = UnicodeCsvReader(f, encoding=encoding, **kwds)

D'utilisation (source fichier est encodé en utf-8):

csv_lines = (
    "абв,123",
    "где,456",
)

for row in UnicodeCsvReader(csv_lines):
    for col in row:
        print(type(col), col)

Sortie:

$ python test.py
<type 'unicode'> абв
<type 'unicode'> 123
<type 'unicode'> где
<type 'unicode'> 456

32voto

Serafeim Points 3812

Une réponse un peu tardive, mais j’utilise l’ unicodecsv avec un grand succès.

22voto

itsadok Points 12971

Le module fourni ici ressemble à un remplacement simple et cool du module csv qui vous permet de travailler avec csv utf-8.

 import ucsv as csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
 

7voto

YOU Points 44812

Il y a l'utilisation de l'exemple Unicode déjà dans cette doc , pourquoi faut-il encore en trouver un autre ou réinventer la roue?

 import csv

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                            dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')
 

4voto

GMLudo Points 53

Je confirme que unicodecsv est un excellent remplacement pour le module csv , je viens de remplacer csv par unicodecsv dans mon code source, et cela fonctionne comme un charme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X