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.
InformationsquelleAutor der Frage Martin | 2009-05-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
.encode
Methode wird angewendet, um einen Unicode-string zu machen, der einen byte-string, aber Sie fordern es auf eine byte-Zeichenfolge statt... der falsche Weg " Runde!!! Blick auf diecodecs
- Modul in der standard-Bibliothek undcodecs.open
insbesondere für eine bessere Allgemeine Lösungen für das Lesen von UTF-8-kodierte Textdateien. Jedoch, für diecsv
- Modul, in der insbesondere zu bekommen, muss man in der utf-8-Daten, und das ist, was Sie bereits bekommen, so dass Ihr code viel einfacher:PS: wenn es sich herausstellt, dass Ihre eingegebenen Daten NICHT in utf-8, aber z.B. in ISO-8859-1, dann benötigen Sie eine "umcodierung" (wenn du daran interessiert bist, auf utf-8
csv
Modul-Ebene), von der formline.decode('whateverweirdcodec').encode('utf-8')
- aber wahrscheinlich können Sie einfach die Namen der vorhandenen Kodierung in deryield
Zeile in meinem code von oben, statt'utf-8'
alscsv
ist eigentlich Los, um sein gerade fein mit ISO-8859-* kodiert bytestrings.InformationsquelleAutor der Antwort Alex Martelli
Python-2.X
Es ist ein unicode-csv Bibliothek, die sollen Ihre Probleme zu lösen, mit dem zusätzlichen Vorteil, nicht naving zu schreiben keine neuen csv-code.
Hier ist ein Beispiel aus Ihrer readme:
Python 3.X
In python 3 ist dies out of the box unterstützt von der build-in
csv
Modul. Siehe dieses Beispiel:InformationsquelleAutor der Antwort jb.
Auch Kasse die Antwort in diesem post:
https://stackoverflow.com/a/9347871/1338557
Er schlägt vor, die Nutzung der Bibliothek genannt ucsv.py. Kurze und einfache Ersatz für CSV geschrieben-Adresse der encoding-problem(utf-8) für Python 2.7. Bietet auch die Unterstützung für csv.DictReader
Bearbeiten: Hinzufügen von Beispielcode, den ich verwendet:
InformationsquelleAutor der Antwort Atripavan
Den link zu der Hilfe-Seite ist die gleiche für python 2.6 und soweit ich weiß, gab es keine änderung in der csv-Modul seit 2.5 (außer bug fixes).
Hier ist der code, der funktioniert einfach, ohne Codierung/Decodierung (Datei da.csv enthält die gleichen Daten wie die variable Daten). Ich gehe davon aus, dass Ihre Datei sollte korrekt gelesen werden kann, ohne jegliche Umbauten.
test.py:
da.csv:
InformationsquelleAutor der Antwort van
Mit
codecs.open
als Alex Martelli vorgeschlagen, erwies sich als nützlich für mich.InformationsquelleAutor der Antwort user1154664
Blick auf die
Latin-1
unicode-Tabelle, ich sehe die Zeichen-code00E9
"LATIN SMALL LETTER E WITH ACUTE". Dies ist das Zeichen mit Akzent in Ihrem sample-Daten. Ein einfacher test inPython
zeigt, dassUTF-8
Kodierung für dieses Zeichen unterscheidet sich von der unicode (fastUTF-16
) - Kodierung.Schlage ich vor, Sie versuchen
encode("UTF-8")
die unicode-Daten vor dem Aufruf der speziellenunicode_csv_reader()
.Einfach Lesen der Daten aus einer Datei verbergen könnte der Codierung, so überprüfen Sie die aktuelle Charakter-Werte.
InformationsquelleAutor der Antwort gimel