在python

时间:2018-05-23 06:29:01

标签: python python-2.7 decode

我是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()

我知道有一些解码正在发生,因为它在错误日志中给出。但我不知道它在哪里发生,为什么?我的问题是在这段代码中发生解码的地方?我真的被困在这里了。

2 个答案:

答案 0 :(得分:1)

在Python 2中,只要您在同一个表达式中混合使用unicodestr,就必须decode() strencode() { {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]  

这意味着格式方法中的变量返回的值不是按照上面的这些值传递的。所以,首先尝试打印这五个变量,它们究竟返回了什么值。