Python Unicode 解码错误 SUDs

3 投票
1 回答
5122 浏览
提问于 2025-04-15 23:26

好的,我在我的脚本顶部加了# -*- 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_listproduct[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

#-*- coding: xxx -*- 这个东西和你遇到的错误没有关系,它只是用来说明这个文件的编码方式,而不是数据库里变量的内容。

你的错误提示是说你试图把一个包含非 ASCII 字符的 str 类型对象传给 unicode() 这个构造函数(这个函数在 suds/sax/text.py 的第43行 被调用)。

你需要把从数据库里取出来的字符串转换成 unicode 对象;比如说,如果你的数据库是用 UTF-8 编码的:

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

想了解更多细节,可以查看 str.decode() 的文档。

撰写回答