Python:urllib.urlencode正在两次转义我的东西*
。。。但它不会以同样的方式逃避两次 我正在尝试将ASCII输出从gpg上传到网站。到目前为止,我得到的比特只是查询表,向我显示它得到的数据,然后在它为HTTP POST请求编码后向我显示:Python:urllib.urlencode正在两次转义我的东西*,python,urlencode,urllib,Python,Urlencode,Urllib,。。。但它不会以同样的方式逃避两次 我正在尝试将ASCII输出从gpg上传到网站。到目前为止,我得到的比特只是查询表,向我显示它得到的数据,然后在它为HTTP POST请求编码后向我显示: cnx = connect() sql = ("SELECT Data FROM SomeTable") cursor = cnx.cursor() cursor.execute(sql) for (data) in cursor: print "encoding : %s" % data
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 = "1\n2"
print data
print urllib.urlencode( { "payload" : data } )
我得到了我所期望的,换行符变成了%0A
1
2
payload=1%0A2
因此,我的直觉是,从mysql查询返回的数据元素与我的文字“1\n2”(可能是一个1元素的dict…dunno)不是同一类型的字符串,但我没有Python功夫知道如何检查它
有人知道这里发生了什么,以及我如何修复它吗?如果没有,有没有关于如何通过HTTP发布此消息并正确转义的建议?假设connect()
是来自某个兼容数据库接口的函数(如内置的sqlite3
,或最流行的mysql
接口),对于游标中的(数据):正在迭代行
对象,而不是字符串
当你打印出来时,你实际上是在打印str(数据)
(通过将它传递到%s
格式)。如果你想对同样的东西进行编码,你必须对str(数据)
进行编码
但是,更好的方法是首先将行作为行(一列的行)处理,而不是依赖str
来执行您想要的操作
另外,如果您试图依靠元组解包来将数据
作为每行的第一个元素,那么您就错了:
for (data) in cursor:
…等同于:
for data in cursor:
如果需要一个元素元组
,则需要逗号:
for data, in cursor:
(如果需要,也可以添加paren,但它们仍然没有任何区别。)
具体地说,迭代游标将调用可选方法,该方法返回游标本身,然后在其上循环调用该方法,其作用与调用
fetchone()
相同,直到结果集用尽,并记录为返回“单个序列”,其类型未定义。在大多数实现中,这是一种特殊的行类型,例如,可以像访问元组一样访问它,但对于以表格格式打印、允许按名称访问等具有特殊语义。所有额外的参数,例如(数据)的在cursor
中,而不是中的数据,或者sql=(“…”)
而不是sql=“…”
?您希望他们做些什么吗?我从一个示例中粘贴了它,该示例中包含了更多元素…如“userquery中的for(first,last,phone)…”。我认为Python甚至需要单个项才能保留在parens中,以便执行它所做的奇怪的结果集查找。哦,“sql=(…)”是…是的,这是从其他东西中遗留下来的。我在循环一些执行插入的代码,我在执行游标。执行(queryTemplate,queryValues)诸如此类。在Python中,括号不构成元组
,逗号构成元组。因此1、2、3
是元组
。在某些情况下,您需要放入元组(或其他类似功能,如生成器表达式)在消除歧义的过程中,仍然是逗号使其成为元组。一旦你这样理解它,那么(1,)
是一个1元素元组,而(1)
是int
。直到你理解了这一点,(1,)
看起来像是一个丑陋的、毫无意义的疣子,你必须记住。是的……它是for循环中“data”之后的逗号。从来没有想过尝试一下,因为在Perl中这样做完全是错误的,Perl是我的首选武器。