Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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:urllib.urlencode正在两次转义我的东西*_Python_Urlencode_Urllib - Fatal编程技术网

Python:urllib.urlencode正在两次转义我的东西*

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

。。。但它不会以同样的方式逃避两次

我正在尝试将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
        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是我的首选武器。