我是python的新手,我收到错误日志'ascii codec无法解码字节...'。错误在行
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()
)
和status_text函数是这样的:
def status_text(self):
si = self.status * 10 - 10
ei = self.status * 10
return self.story.project.task_status_names[si:ei].strip()
我知道有一些解码正在发生,因为它在错误日志中给出。但我不知道它在哪里发生,为什么?我的问题是在这段代码中发生解码的地方?我真的被困在这里了。
答案 0 :(得分:1)
在Python 2中,只要您在同一个表达式中混合使用unicode
和str
,就必须decode()
str
或encode()
{ {1}}自动使它们工作。它使用您的默认编码执行此操作,通常为unicode
。因此,如果您的任何字符串不是ASCII,则会出现这样的错误。
发生这种情况的一个地方是,您在'ascii'
对象上调用format
并向其传递unicode
值以进行格式化:
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)
返回的字符串不是ASCII,就像我更简单的例子中的task.status_text()
一样。
要解决此问题,您需要小心始终始终使用一种类型:
'abc\xe9'
理想情况下,您可以将数据库界面配置为首先返回>>> print '{}'.format('abc\xe9')
abcé
而不是编码unicode
:
str
如果没有,您需要明确>>> print u'{}'.format(u'abcé')
abcé
或decode
,以便指定正确的编码:
encode
当然我不知道你的>>> print u'{}'.format('abc\xe9'.decode('latin-1'))
abcé
来自哪里,所以我不知道它是否是拉丁语-1。 (事实上,UTF-8可能更有可能。)但你应该知道,或者能够查找或以其他方式查找。
如果您认为这是一个巨大的痛苦......那么,这正是Python 3十多年前发明的原因。一旦您决定升级,所有这些问题都会消失。
答案 1 :(得分:-1)
在这里,我尝试使用以下输入代码生成文本格式:
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
我得到的输出:
*rahul* moved a `Task` on <www.google.com|Card Pro-12> to `Hello`
[Finished in 0.0s]
这意味着格式方法中的变量返回的值不是按照上面的这些值传递的。所以,首先尝试打印这五个变量,它们究竟返回了什么值。