Python-Modul wie csv-DictReader mit voller utf8-Unterstützung

Ich brauche Import-Daten aus einer CSV in meinem Projekt und ich brauche ein Objekt wie DictReader, aber mit voller utf8 unterstützt, jemand kennt ein Modul oder App mit diesem?

2 Solutions collect form web for “Python-Modul wie csv-DictReader mit voller utf8-Unterstützung”

Ihre Daten werden in UTF-8 nicht kodiert. Es ist (meist) in cp1252 codiert . Die Daten sollen spanische Namen enthalten. Das am weitesten verbreitete Nicht-ASCII-Zeichen ist '\ xd1` (dh lateinischer Großbuchstabe N mit Tilde) – das ist der Charakter, der die Ausnahme verursacht hat.

Eines der Nicht-ASCII-Zeichen in der Datei ist '\ x8d'. Es ist nicht in cp1252. Es erscheint, wo der Buchstabe A im Namen VASQUEZ erscheinen soll. Von den anderen, '\ x94' (lockiges doppeltes Zitat in cp1252) erscheint in der Mitte eines Namens. Die übrigen können auch Fehler darstellen.

Ich schlage vor, dass Sie dieses kleine Code-Fragment ausführen, um Zeilen mit verdächtigen Zeichen in ihnen zu drucken:

 for lino, line in enumerate(open('sampleresults.csv')): if any(c in line for c in '\x8d\x94\xc1\xcf\xd3'): print "%d %r\n" % (lino+1, line) 

Und repariere die Daten.

Dann brauchst du einen csv DictReader mit voller und generalisierter Decodierungsunterstützung. Vollständige Mittel, die die Feldnamen aka dict Schlüssel sowie die Daten decodieren. Generalized bedeutet keine Hardcodierung der Codierung.

Import csv

 def UnicodeDictReader(str_data, encoding, **kwargs): csv_reader = csv.DictReader(str_data, **kwargs) # Decode the keys once keymap = dict((k, k.decode(encoding)) for k in csv_reader.fieldnames) for row in csv_reader: yield dict((keymap[k], v.decode(encoding)) for k, v in row.iteritems()) dozedata = ['\xd1,\xff', '\xd2,\xfe', '3,4'] print list(UnicodeDictReader(dozedata, 'cp1252')) 

Ausgabe:

 [{u'\xd1': u'\xd2', u'\xff': u'\xfe'}, {u'\xd1': u'3', u'\xff': u'4'}] 

Und hier ist was du mit deiner Beispieldatei bekommst (nur erste Datenzeile, Python 2.7.1, Windows 7):

 >>> import csv >>> from pprint import pprint as pp >>> def UnicodeDictReader(str_data, encoding, **kwargs): ... csv_reader = csv.DictReader(str_data, **kwargs) ... # Decode the keys once ... keymap = dict((k, k.decode(encoding)) for k in csv_reader.fieldnames) ... for row in csv_reader: ... yield dict((keymap[k], v.decode(encoding)) for k, v in row.iteritems()) ... >>> f = open('sampleresults.csv', 'rb') >>> drdr = UnicodeDictReader(f, 'cp1252') >>> pp(drdr.next()) {u'APELLIDO': u'=== family names redacted ===', u'CATEGORIA': u'ABIERTA', u'CEDULA': u'10000640', u'DELAY': u' 0:20', u'EDAD': u'25', u'EMAIL': u'mimail640', u'NO.': u'640', u'NOMBRE': u'=== given names redacted ===', u'POSICION CATEGORIA': u'1', u'POSICION CATEGORIA EN KM.5': u'11', u'POSICION GENERAL CHIP': u'1', u'POSICION GENERAL EN KM.5': u'34', u'POSICION GENERAL GUN': u'1', u'POSICION GENERO': u'1', u'PRIMEROS 5KM.': u'0:32:55', u'PROMEDIO/KM.': u' 5:44', u'SEGUNDOS KM.': u'0:24:05', u'SEX': u'M', u'TIEMPO CHIP': u'0:56:59', u'TIEMPO GUN': u'0:57:19'} >>> 

Als die Antwort auf diesen Beitrag sagte:

 def UnicodeDictReader(utf8_data, **kwargs): csv_reader = csv.DictReader(utf8_data, **kwargs) for row in csv_reader: yield dict([(key, unicode(value, 'utf-8')) for key, value in row.iteritems()]) 

Sie können unter meinem Beispielcode sehen. Ich benutze deine CSV-Datei (siehe Kommentare).

 import csv def UnicodeDictReader(utf8_data, **kwargs): csv_reader = csv.DictReader(utf8_data, **kwargs) for row in csv_reader: yield dict([(key, unicode(value, 'utf-8')) for key, value in row.iteritems()]) f = open('sampleresults.csv', 'r') a = UnicodeDictReader(f) for i in a: if i['NOMBRE'] == 'GUIDO ALEJANDRO': print i['APELLIDO'] 

Ouput:

 MUÑOZ RENGIFO 

Sie können sehen, dass das 'Ñ' korrekt codiert ist.

  • Warum Zeichen ID 160 wird nicht als Unicode in PDFMiner erkannt?
  • Drucken auf UTF-8 codierte Datei mit plattformabhängigen Zeilenumbrüchen?
  • Überprüfen Sie auf gültige utf8 Zeichenfolge in Python
  • Wie bekomme ich email.Header.decode_header, um mit Nicht-ASCII-Zeichen zu arbeiten?
  • Warum diese HTML-Vorlage auf jinja2 / python produziert 'u ()' Tupel-Fehler in String-Substitution?
  • Python 3 CSV-Datei, die UnicodeDecodeError: 'utf-8' Codec kann nicht decode Byte Fehler, wenn ich drucken
  • Python check if utf-8 string ist Großbuchstaben
  • Arbeiten mit UTF-8 in Python
  • Encoding Fehler in Django auf Heroku
  • Probleme beim Schreiben von gekratzten Daten in csv mit slawischen Zeichen (UnicodeEncodeError & TypeError)
  • Konvertiere GBK in utf8 string in python
  • Python ist die beste Programmiersprache der Welt.