Lesen einer UTF8-CSV-Datei mit Python
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?
Martin, wenn du in der Gegend bist, würden Sie die Umstellung der akzeptierten Antwort von Martelli ist Python 2 nur beantworten.
InformationsquelleAutor 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.Bitte sehen Sie diese Antwort für Python 3
InformationsquelleAutor 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 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:
#Downvoter - Nicht sicher, warum Sie dachte, seine von keinerlei nutzen. Die ucsv Bibliothek arbeitete, einfach fein für mich. Geholfen lösen die unicde Fehler, dass ich mich beschäftigt hatte, seit 2 Tagen. Wenn Sie waren auf der Suche für einige Beispiel-code, hier geht es in den edit @Yaje - ich habe einige details, auch den Beispiel-code. Und korrigiert den link, das war früher, wies auf einige andere posten.
Einen bestimmten Grund, Sie sind das öffnen einer text-Datei als eine binäre? 'rb' für das öffnen von Binär-Dateien.
InformationsquelleAutor Atripavan
Mit
codecs.open
als Alex Martelli vorgeschlagen, erwies sich als nützlich für mich.Importieren Sie die
csv
- Modul, sondern verwenden Sie es nicht.InformationsquelleAutor user1154664
Wenn Sie wollen Lesen Sie eine CSV-Datei mit der Kodierung utf-8, eine minimalistische Ansatz, den ich empfehlen ist die Verwendung von so etwas wie dieses:
Mit dieser Aussage, die Sie später verwenden können Sie eine CSV-reader, mit zu arbeiten.
encoding
imopen
InformationsquelleAutor Nick Cuevas
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:
Ich kann mir vorstellen, dass auf deinem system das Komma ist nicht ein Standard-Trennzeichen. Versuchen Sie, fügen Sie
delimiter=','
stattdialect=csv.excel
.InformationsquelleAutor van
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 gimel