Python Unicode Ошибка декодирования SUD - PullRequest
3 голосов
/ 02 июня 2010

ОК, поэтому у меня есть # -*- coding: utf-8 -*- в верхней части моего скрипта, и он работал для того, чтобы иметь возможность извлекать данные из базы данных, в которой были забавные символы (Ñ, Õ, é, -, -, ',…) и сохранить эти данные в переменные ... но я столкнулся с другими проблемами, вижу, я извлекаю свои данные, организую их, а затем сбрасываю в переменные, например:

title = product[1]

Где product[1] из моей базы данных результатов

Затем я загружаю его на Suds примерно так:

array_of_inventory_item_submit = ca_client_inventory.factory.create('ArrayOfInventoryItemSubmit')
for product in products:
    inventory_item_submit = ca_client_inventory.factory.create('InventoryItemSubmit')
    inventory_item_list = get_item_list(product)
    inventory_item_submit = [inventory_item_list]
    array_of_inventory_item_submit.InventoryItemSubmit.append(inventory_item_submit)
#Call that service baby!
ca_client_inventory.service.SynchInventoryItemList(accountID, array_of_inventory_item_submit)

Где get_item_list устанавливает product[1] в заголовок и (включая целый ряд других узлов):

inventory_item_submit.Title = title

Так что все работает нормально, пока я не вызову ca_client_inventory.service.SynchInventoryItemList, который содержит array_of_inventory_item_submit, который содержит заголовок со странным символом ... вот ошибка:

Traceback (most recent call last):
  File "upload_all_inventory_ebay.py", line 421, in <module>
    ca_client_inventory.service.SynchInventoryItemList(accountID, array_of_inventory_item_submit)
  File "build/bdist.macosx-10.6-i386/egg/suds/client.py", line 539, in __call__
  File "build/bdist.macosx-10.6-i386/egg/suds/client.py", line 592, in invoke
  File "build/bdist.macosx-10.6-i386/egg/suds/bindings/binding.py", line 118, in get_message
  File "build/bdist.macosx-10.6-i386/egg/suds/bindings/document.py", line 63, in bodycontent
  File "build/bdist.macosx-10.6-i386/egg/suds/bindings/document.py", line 105, in mkparam
  File "build/bdist.macosx-10.6-i386/egg/suds/bindings/binding.py", line 260, in mkparam
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/core.py", line 62, in process
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/core.py", line 75, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 102, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 243, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 182, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/core.py", line 75, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 102, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 298, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 182, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/core.py", line 75, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 102, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 298, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 182, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/core.py", line 75, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 102, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 243, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 182, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/core.py", line 75, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 102, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/mx/appender.py", line 198, in append
  File "build/bdist.macosx-10.6-i386/egg/suds/sax/element.py", line 251, in setText
  File "build/bdist.macosx-10.6-i386/egg/suds/sax/text.py", line 43, in __new__
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 116: ordinal not in range(128)

И что теперь? Я предполагаю, что мой сценарий может принимать эти забавные символы, потому что у меня # -*- coding: utf-8 -*- вверху, а у Suds нет этого в верхней части его файлов. Я действительно хочу пойти и изменить файлы Suds ... мы все знаем, что это наименее желаемое последнее возможное решение ... что я могу сделать?

1 Ответ

10 голосов
/ 02 июня 2010

#-*- coding: xxx -*- не имеет ничего общего с этой ошибкой, она применяется только к кодировке исходного файла , в котором он объявлен, а не к содержимому переменных, поступающих из базы данных.

Ваша ошибка говорит о том, что вы пытаетесь передать объект типа str, содержащий не ASCII-символы, конструктору unicode() (который вызывается в строке 43 suds / sax / text.py ).

Вы должны преобразовать строки из базы данных в unicode объекты; например, если ваша база данных закодирована в UTF-8:

title = product[1].decode("UTF-8")

Подробнее см. Документацию str.decode () .

...