Ich versuche, eine CSV-Datei mit Akzentzeichen mit Python zu lesen (nur französische und / oder spanische Zeichen). Basierend auf der Python 2.5-Dokumentation für den csvreader ( http://docs.python.org/library/csv.html ) habe ich den folgenden Code zum Lesen der CSV-Datei entwickelt, da der csvreader nur ASCII unterstützt.
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:
...
Unten finden Sie einen Auszug aus der CSV-Datei, die ich zu lesen versuche:
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, in UTF-8 zu codieren / decodieren, erhalte ich immer noch die folgende Ausnahme:
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 behebe ich das?
python
utf-8
csv
character-encoding
Martin
quelle
quelle
Antworten:
Die
.encode
Methode wird auf eine Unicode-Zeichenfolge angewendet, um eine Byte-Zeichenfolge zu erstellen. aber du rufst es stattdessen auf einer Byte-Zeichenfolge auf ... falsch herum! Schaue auf diecodecs
Modul in der Standardbibliothek an undcodecs.open
suchen Sie insbesondere nach besseren allgemeinen Lösungen zum Lesen von UTF-8-codierten Textdateien.csv
Insbesondere für das Modul müssen Sie jedoch utf-8-Daten übergeben, und das erhalten Sie bereits, damit Ihr Code viel einfacher sein kann:PS: Wenn sich herausstellt, dass Ihre Eingabedaten NICHT in utf-8, sondern z. B. in ISO-8859-1 vorliegen, benötigen Sie eine "Transcodierung" (wenn Sie utf-8 auf
csv
Modulebene verwenden möchten ). , der Formline.decode('whateverweirdcodec').encode('utf-8')
- aber wahrscheinlich können Sie einfach den Namen Ihrer vorhandenen Codierung in deryield
Zeile in meinem Code oben verwenden, anstatt'utf-8'
, wiecsv
es mit ISO-8859- * codierten Bytestrings eigentlich in Ordnung sein wird.quelle
Python 2.X.
Es gibt eine Unicode-CSV- Bibliothek, die Ihre Probleme lösen sollte, mit dem zusätzlichen Vorteil, dass Sie nicht navigieren müssen, um neuen CSV-bezogenen Code zu schreiben.
Hier ist ein Beispiel aus ihrer Readme:
Python 3.X.
In Python 3 wird dies vom integrierten
csv
Modul sofort unterstützt. Siehe dieses Beispiel:quelle
Wenn Sie eine CSV-Datei mit der Codierung utf-8 lesen möchten, empfehle ich Ihnen einen minimalistischen Ansatz: Gehen Sie wie folgt vor:
Mit dieser Anweisung können Sie später einen CSV-Reader zum Arbeiten verwenden.
quelle
encoding
inopen
open('file.csv', 'r', encoding="ISO8859")
Überprüfen Sie auch die Antwort in diesem Beitrag: https://stackoverflow.com/a/9347871/1338557
Es wird die Verwendung der Bibliothek ucsv.py vorgeschlagen. Kurzer und einfacher Ersatz für CSV, der geschrieben wurde, um das Codierungsproblem (utf-8) für Python 2.7 zu beheben. Bietet auch Unterstützung für csv.DictReader
Bearbeiten : Hinzufügen von Beispielcode, den ich verwendet habe:
quelle
Die Verwendung,
codecs.open
wie Alex Martelli vorgeschlagen hatte, erwies sich für mich als nützlich.quelle
csv
Modul, verwenden es aber nicht.Der Link zur Hilfeseite ist der gleiche für Python 2.6 und meines Wissens gab es seit 2.5 keine Änderung im CSV-Modul (abgesehen von Fehlerkorrekturen). Hier ist der Code, der nur ohne Codierung / Decodierung funktioniert (Datei da.csv enthält dieselben Daten wie die variablen Daten ). Ich gehe davon aus, dass Ihre Datei ohne Konvertierungen korrekt gelesen werden sollte.
test.py:
da.csv:
quelle
delimiter=','
stattdialect=csv.excel
.Wenn nichts für Sie funktioniert hat, haben Sie möglicherweise vergessen, Ihrem Weg zu entkommen.
Zum Beispiel dieser Code:
Würde zu einem Fehler führen:
Um dies zu beheben, gehen Sie einfach wie folgt vor:
quelle
Wenn ich mir die
Latin-1
Unicode-Tabelle ansehe , sehe ich den Zeichencode00E9
" LATIN SMALL LETTER E WITH ACUTE ". Dies ist das akzentuierte Zeichen in Ihren Beispieldaten. Ein einfacher Test inPython
zeigt, dass sich dieUTF-8
Codierung für dieses Zeichen von der (fastUTF-16
) Unicode- Codierung unterscheidet.Ich schlage vor, Sie versuchen es mit
encode("UTF-8")
den Unicode-Daten, bevor Sie das Special aufrufenunicode_csv_reader()
. Durch einfaches Lesen der Daten aus einer Datei wird möglicherweise die Codierung ausgeblendet. Überprüfen Sie daher die tatsächlichen Zeichenwerte.quelle
Hatte das gleiche Problem auf einem anderen Server, stellte jedoch fest, dass die Gebietsschemas durcheinander sind.
Das Problem wurde behoben
quelle