Eine UTF8 CSV-Datei mit Python lesen

Ich versuche zu Lesen, eine CSV-Datei mit Umlauten in Python (nur in Französisch und/oder Spanisch-Zeichen). Basierend auf dem Python 2.5-Dokumentation für die csvreader (http://docs.python.org/library/csv.html), ich kam mit dem folgenden code zum Lesen der CSV-Datei, da der csvreader unterstützt nur ASCII.

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')

filename = 'output.csv'
reader = unicode_csv_reader(open(filename))
try:
    products = []
    for field1, field2, field3 in reader:
        ...

Nachfolgend ein Auszug der CSV-Datei, die ich versuche zu Lesen:

0665000FS10120684,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Bleu
0665000FS10120689,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Gris
0665000FS10120687,SD1200IS,Appareil photo numérique PowerShot de 10 Mpx de Canon avec trépied (SD1200IS) - Vert
...

Obwohl ich versuche zu Kodieren/Dekodieren von UTF-8, ich bin noch immer die folgende exception:

Traceback (most recent call last):
  File ".\Test.py", line 53, in <module>
    for field1, field2, field3 in reader:
  File ".\Test.py", line 40, in unicode_csv_reader
    for row in csv_reader:
  File ".\Test.py", line 46, in utf_8_encoder
    yield line.encode('utf-8', 'ignore')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 68: ordinal not in range(128)

Wie kann ich dieses Problem beheben?

Kommentar zu dem Problem
Martin, wenn du in der Gegend bist, würden Sie die Umstellung der akzeptierten Antwort von Martelli ist Python 2 nur beantworten. Kommentarautor: Antti Haapala

InformationsquelleAutor der Frage Martin | 2009-05-24

Schreibe einen Kommentar