3

我有一个非常不寻常的问题。我正在使用 python 2.6 对 bulkSMS 网关进行 API 调用。现在如果我这样打电话

req = urllib2.Request(url)
urllib2.urlopen(req).read()

我将此(正确)响应打印回终端

'<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>'

但是当我将此输出分配给变量时,

reply = urllib2.urlopen(req).read()

当我打印到终端时,我得到了这个(不正确的)响应

print reply
</RESPONSE>.3403</credits>

有人愿意解释这里发生了什么吗?

4

2 回答 2

3

它将\r字符解释为特殊字符(ASCII 回车 - 请参阅此处的一些示例)并在打印时将它们从字符串中删除。要包含它们,您可以使用string-escape编码:

In [1]: resp = '<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>'

In [2]: print resp
</RESPONSE>.3403</credits>

In [3]: print resp.encode('string-escape')
<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>

不直接适用于您的情况,但这种转义的另一种方式是在字符串前面加上r,这使其成为“原始”字符串并保留反斜杠(您会在正则表达式中看到很多):

In [4]: resp = r'<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>'

In [5]: print resp
<RESPONSE>\r<status>-4</status>\r<credits>31.3403</credits>\r</RESPONSE>
于 2012-12-20T02:36:19.937 回答
2

该字符串包含正确的数据,它只是以一种奇怪的方式打印。 \r是一个回车,一些系统将其解释为“回到行首并从那里开始覆盖”。因此,您会看到"</RESPONSE>"前一行中更长的数据(因此未被覆盖)。

您的数据包含的内容有点奇怪,\r因为如今它不像行尾约定那样常见。

您可以打印repr(response)以查看响应,而无需\r以这种方式进行解释。您在线进行的任何处理都应该可以正常工作,因为所有数据都在那里,只是没有打印。

于 2012-12-20T02:39:24.267 回答