Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的引擎盖下解码_Python_Python 2.7_Decode - Fatal编程技术网

python中的引擎盖下解码

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,

我是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,
        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
而不是encoded
str

>>> 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é