如何在Python中将字典转换为查询字符串?

如何在Python中将字典转换为查询字符串?,python,urllib2,urllib,Python,Urllib2,Urllib,使用cgi.parse_qs()后,如何将结果(字典)转换回查询字符串?正在查找类似于urllib.urlencode()的内容 Python 3 urllib.parse.urlencode(查询,doseq=False,[…]) 将映射对象或两元素元组序列(可能包含str或字节对象)转换为百分比编码ASCII文本字符串 - dict是一种映射 传统Python urllib.urlencode(query[,doseq]) 将映射对象或两个元素元组序列转换为“百分比编码”字符串。。。一系列由

使用
cgi.parse_qs()
后,如何将结果(字典)转换回查询字符串?正在查找类似于
urllib.urlencode()
的内容

Python 3
urllib.parse.urlencode(查询,doseq=False,[…])

将映射对象或两元素元组序列(可能包含str或字节对象)转换为百分比编码ASCII文本字符串

-

dict
是一种映射

传统Python
urllib.urlencode
query
[,
doseq
])
将映射对象或两个元素元组序列转换为“百分比编码”字符串。。。一系列由
“&”
字符分隔的
键=值

-


也许你在找这样的东西:

def dictToQuery(d):
  query = ''
  for key in d.keys():
    query += str(key) + '=' + str(d[key]) + "&"
  return query

它获取一个字典并将其转换为查询字符串,就像urlencode一样。它将在查询字符串中附加一个最后的“&”,但如果是问题,则返回查询[:-1]将修复该问题。

您正在查找与
urllib.urlencode()完全类似的内容。

但是,当您调用(不同于)时,字典键是唯一的查询变量名称,值是每个名称的值列表

为了将这些信息传递到中,您必须“展平”这些列表。下面是如何使用元组列表执行此操作:

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)

在python3中,略有不同:

from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
输出:
'pram1=foo¶m2=bar'

要实现python2和python3的兼容性,请尝试以下操作:

try:
    #python2
    from urllib import urlencode
except ImportError:
    #python3
    from urllib.parse import urlencode

你见过str.join()吗?怎么样
urllib.quote_plus()
?@garbados您的解决方案应该可以在简单的情况下使用。但是,在
urllib.py
中查看一下
urlencode
(在Python安装中应该可以看到),看看为什么创建查询字符串有时不像您的答案所暗示的那么简单(特别是需要“引用”URL中无效的某些字符)@Ignacio还引用了两个函数,它们将清理您的实现并使其正确。很抱歉,这个粗制滥造的实现。这表明我应该更加小心地回答我从未面对过的问题。虽然这可能不是最好的答案,但这正是我单击此问题标题时想要看到的。在一个dict中,我只有4项需要转换成一个名称=值对,由“&”分隔。我的价值观是可控的。str.join()在我的例子中很方便,但我不需要quote_plus(),因为它不是面向公众的代码:)谢谢@harperville但是更正确的方法(
from urllib.parse import urlencode;urlencode(您的指令)
)比这更短更简单!我承认,有时重新发明轮子是明智的,即使是在使用现有的、设计良好的轮子很昂贵或不方便的时候,也很糟糕,但是在这里,使用现成的轮子比使用自己的劣质轮子更容易、更快。这是真的,但是
cgi.parse\u qs()返回的
dict
实际上有
列表
s作为其“值”。直接传入这些将导致非常奇怪的查询字符串。这会教我读更多的第一句话!在Python 3中,问题是urlencode会将空格转换为+,这是不推荐的。@user1633272:根据谁的说法不推荐?或者您可以传递
doseq=True
@downvoter:我如何改进这个答案?我写这本书已经六年了!注:另见: