Python:urllib.urlencode正在两次逃离我的东西



。。。但它并没有以同样的方式逃脱两次。

我正在尝试将gpg的ASCII输出上传到一个网站。所以,到目前为止,我得到的只是查询表,向我显示它得到的数据,然后在它为HTTPPOST请求编码后向我显示:

cnx = connect()
sql = ("SELECT Data FROM SomeTable")
cursor = cnx.cursor()
cursor.execute(sql)
for (data) in cursor:
        print "encoding : %s" % data
        postdata = urllib.urlencode( { "payload" : data } ) 
        print "encoded as %s" % postdata

但我得到的是:

encoding : -----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.12 (GNU/Linux)
.... etc...
encoded as payload=%28u%27-----BEGIN+PGP+MESSAGE-----%5CnVersion%3A+GnuPG+v1.4.12+... etc ...

需要注意的是,换行符并没有像我预期的那样变成%0A。相反,它们以某种方式被转义为"\n",然后反斜杠被转义为%5C,因此换行符变为"%5Cn"。更奇怪的是,数据被预处理为%28u%27,结果是">(u'"。

奇怪的是,如果我只是用做一个基本测试

data = "1n2"
print data
print urllib.urlencode( { "payload" : data } )

我得到了我所期望的,换行变成%0A。。。

1
2
payload=1%0A2

因此,我的直觉是,从mysql查询返回的数据元素与我的文字"1\n2"(可能是一个单元素dict.…dunno(不是同一种字符串,但我没有Python的功夫来知道如何检查它。

有人知道这里发生了什么,我该怎么解决吗?如果没有,有什么建议可以通过HTTP进行POST,并正确地转义所有内容?

假设connect()是某个兼容DB-API 2.0的数据库接口(如内置的sqlite3或最流行的mysql接口(中的函数,则for (data) in cursor:迭代Row对象,而不是字符串。

打印出来时,实际上是在打印str(data)(通过将其传递为%s格式(。如果你想对同样的东西进行编码,你必须对str(data)进行编码。

然而,更好的方法是首先将行作为(一列的(行来处理,而不是依赖str来执行您想要的操作。

PS,如果你试图依靠元组拆包来使data成为每行的第一个元素,那你就错了:

for (data) in cursor:

…与相同

for data in cursor:

如果你想要一个单一元素tuple,你需要一个逗号:

for data, in cursor:

(如果你愿意,你也可以添加parens,但它们仍然没有什么区别。(

具体地说,迭代光标将调用可选的__iter__方法,该方法返回光标本身,然后循环调用其上的next方法,这与调用fetchone()的操作相同,直到结果集用完,并且fetchone被记录为返回"单个序列",其类型未定义。在大多数实现中,这是一种特殊的行类型,如sqlite3.Row,可以像访问tuple一样访问它,但对于以表格格式打印、允许按名称访问等具有特殊的语义。

相关内容

  • 没有找到相关文章

最新更新