。。。但它并没有以同样的方式逃脱两次。
我正在尝试将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
一样访问它,但对于以表格格式打印、允许按名称访问等具有特殊的语义。