2 Stimmen

Google App Engine: UnicodeDecode-Fehler beim Hochladen von Massendaten

Ich erhalte einen seltsamen Fehler mit Google App Engine devserver 1.3.5 und Python 2.5.4 unter Windows.

Eine Beispielzeile in der CSV-Datei:

EQS,550,foobar,"<some><html><garbage /></html></some>",odp,Ti4=,http://url.com,success

Der Fehler:

..................................................................................................................[ERROR   ] [Thread-1] WorkerThread:
Traceback (most recent call last):
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\adaptive_thread_pool.py", line 150, in WorkOnItems
    status, instruction = item.PerformWork(self.__thread_pool)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\bulkloader.py", line 695, in PerformWork
    transfer_time = self._TransferItem(thread_pool)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\bulkloader.py", line 852, in _TransferItem
    self.request_manager.PostEntities(self.content)
  File "C:\Program Files\Google\google_appengine\google\appengine\tools\bulkloader.py", line 1296, in PostEntities
    datastore.Put(entities)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore.py", line 282, in Put
    req.entity_list().extend([e._ToPb() for e in entities])
  File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore.py", line 687, in _ToPb
    properties = datastore_types.ToPropertyPb(name, values)
  File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore_types.py", line 1499, in ToPropertyPb
    pbvalue = pack_prop(name, v, pb.mutable_value())
  File "C:\Program Files\Google\google_appengine\google\appengine\api\datastore_types.py", line 1322, in PackString
    pbvalue.set_stringvalue(unicode(value).encode('utf-8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 36: ordinal not in range(128)
[INFO    ] Unexpected thread death: Thread-1
[INFO    ] An error occurred. Shutting down...
..[ERROR   ] Error in Thread-1: 'ascii' codec can't decode byte 0xe8 in position 36: ordinal not in range(128)

Wird der Fehler durch ein Problem mit einer base64-Zeichenfolge erzeugt, von denen es in jeder Zeile eine gibt?

KGxwMAoobHAxCihTJ0JJT0VFJwpwMgpJMjYxMAp0cDMKYWEu

KGxwMAoobHAxCihTJ01BVEgnCnAyCkkyOTQwCnRwMwphYS4=

Der Datenlader:

class CourseLoader(bulkloader.Loader):
    def __init__(self):
        bulkloader.Loader.__init__(self, 'Course',
                                   [('dept_code', str),
                                    ('number', int),
                                    ('title', str),
                                    ('full_description', str),
                                    ('unparsed_pre_reqs', str),
                                    ('pickled_pre_reqs', lambda x: base64.b64decode(x)),
                                    ('course_catalog_url', str),
                                    ('parse_succeeded', lambda x: x == 'success')
                                   ])

loaders = [CourseLoader]

Gibt es eine Möglichkeit, aus dem Traceback zu erkennen, welche Zeile den Fehler verursacht hat?

アップデイト : Es sieht so aus, als gäbe es zwei Zeichen, die Fehler verursachen: è und ® . Wie kann ich Google App Engine dazu bringen, sie zu verarbeiten?

0voto

Alex Martelli Punkte 805329

Es sieht so aus, als ob einige Zeilen der CSV-Datei Nicht-Ascii-Daten enthalten (vielleicht ein LATIN SMALL LETTER E WITH GRAVE -- das ist es, was 0xe8 wäre zum Beispiel ISO-8859-1), und dennoch ordnen Sie es der str (sollte sein unicode und ich glaube, die CSV sollte in utf-8 sein).

Um herauszufinden, ob eine Zeile einer Textdatei Nicht-Ascii-Daten enthält, hilft ein einfaches Python-Snippet, z. B.:

>>> f = open('thefile.csv')
>>> prob = []
>>> for i, line in enumerate(f):
...   try: unicode(line)
...   except: prob.append(i)
...
>>> print 'Problems in %d lines:' % len(prob)
>>> print prob

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X