python中的引擎盖下解码
我是python新手,我得到一个错误日志“ascii编解码器无法解码字节…”。错误是一致的python中的引擎盖下解码,python,python-2.7,decode,Python,Python 2.7,Decode,我是python新手,我得到一个错误日志“ascii编解码器无法解码字节…”。错误是一致的 status = task.status_text() 源代码 text = u"*{username}* moved a `Task` on <{url}|Card {prefix}-{local_id}> to `{status}`".format( username = slack_util.user_name(user), url = url,
status = task.status_text()
源代码
text = u"*{username}* moved a `Task` on <{url}|Card {prefix}-{local_id}> to `{status}`".format(
username = slack_util.user_name(user),
url = url,
prefix = project.prefix,
local_id = story.local_id,
status=task.status_text()
)
我知道有一些解码正在发生,因为它是在错误日志中给出的。但我不知道发生在哪里,为什么?我的问题是这段代码中的解码发生在哪里?我真的被困在这里了。在这里,我使用以下输入尝试了您的代码,以生成文本格式:
text = u"*{username}* moved a `Task` on <{url}|Card {prefix}-{local_id}> to `{status}`".format(
username = 'rahul',
url = 'www.google.com',
prefix = 'Pro',
local_id = '12',
status='Hello'
)
print text
text=u“*{username}*将“任务”移动到“{status}”格式(
用户名='rahul',
url='www.google.com',
前缀='Pro',
本地_id='12',
状态=“你好”
)
打印文本
我得到的结果是:
*rahul* moved a `Task` on <www.google.com|Card Pro-12> to `Hello`
[Finished in 0.0s]
*rahul*将“任务”移到了“你好”`
[在0.0秒内完成]
这意味着format方法中的变量返回的值与上面我传递的值不同。因此,首先,请尝试打印这五个变量返回的值。在Python 2中,每当在同一表达式中混合使用
unicode
和str
时,它必须解码()
str或encode()
unicode自动运行,使其正常工作。它使用您的默认编码(通常是'ascii'
)来实现这一点。因此,如果您的字符串中有一个不是ASCII,就会出现如下错误
发生这种情况的一个地方是,在unicode
对象上调用format
,并将要格式化的str
值传递给它:
>>> u'{}'.format('abc')
u'abc'
>>> u'{}'.format('abc\xe9')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)
请注意,代码中有一行与此类似的代码。显然,task.status\u text()
返回的字符串不是ASCII,就像我简单示例中的'abc\xe9'
一样
要解决此问题,您需要小心始终一致地使用一种类型:
>>> print '{}'.format('abc\xe9')
abcé
理想情况下,您可以将数据库接口配置为首先返回unicode
而不是encodedstr
:
>>> print u'{}'.format(u'abcé')
abcé
如果没有,则需要显式执行解码
或编码
,以便指定正确的编码:
>>> print u'{}'.format('abc\xe9'.decode('latin-1'))
abcé
当然,我不知道你的状态\u文本来自哪里,所以我不知道它是否是拉丁语-1。(事实上,UTF-8的可能性更大。)但您应该知道,或者能够查找它,或者以其他方式找到它
如果你认为这是一个巨大的痛苦…那么,这就是为什么Python 3在十多年前被发明的原因。一旦您决定升级,所有这些问题都将消失。如果不知道slack\u util
和project
和story
和task
是什么,您的问题就无法回答。请看。@AranFey。谢谢你的评论。Python堆栈跟踪在“status=task.status_text()”行中显示错误,我已经给出了相关代码。这还不够吗?如果你是Python新手,你使用Python 2.7而不是3.6有什么原因吗?是的,我所在的公司使用的是Python 2.7。那么,你所能做的就是巧妙地提醒你的老板,Python开发人员将在一年半后放弃Python 2.7,大多数主要的linux发行版已经转向提供最低限度的支持,许多重要的软件包已经放弃了它,但是,你知道,不着急,到目前为止,你的团队只有8-1/2年的准备时间,比最初的截止日期晚了3年,所以我相信他们可以继续推迟,是吗?正如我在问题中提到的,我没有数据信息,因为这个错误来自日志文件。关于数据,我只知道数据库中存储的数据是unicode格式的。@sourabh我理解您的问题,但至少您可以在传入之前打印这些变量的值。因此,您可以了解一些情况。这并不能回答问题。您的示例中没有任何非ASCII字符,因此当然不会重现OP的问题。但是…这告诉他什么?
>>> print u'{}'.format('abc\xe9'.decode('latin-1'))
abcé