如何在 Python 中将字典转换为查询字符串?
Posted
技术标签:
【中文标题】如何在 Python 中将字典转换为查询字符串?【英文标题】:How to convert a dictionary to query string in Python? 【发布时间】:2011-12-09 18:16:02 【问题描述】:使用cgi.parse_qs()
后,如何将结果(字典)转换回查询字符串?寻找类似于urllib.urlencode()
的东西。
【问题讨论】:
注:cgi.parse_qs()
is deprecated. Use urlparse.parse_qs() instead.
另见: ***.com/questions/5607551/…
【参考方案1】:
Python 3
urllib.parse.urlencode(query, doseq=False, [...])
将映射对象或可能包含 str 或 bytes 对象的二元素元组序列转换为百分比编码的 ASCII 文本字符串。
——Python 3
urllib.parse
docs
dict
是一个映射。
旧版 Python
urllib.urlencode
(query
[,doseq
]) 将映射对象或二元素元组序列转换为“百分比编码”字符串...由'&'
字符分隔的一系列key=value
对...
——Python 2.7
urllib
docs
【讨论】:
这是真的,但cgi.parse_qs()
返回的dict
实际上有list
s 作为它的“值”。直接传递这些将导致看起来很奇怪的查询字符串。
确实如此。这将教会我阅读比第一句话更多的内容!
urllib.parse.urlencode 在 Python 3 中。
问题是urlencode会把空格转成+,不推荐。
@user1633272:谁不推荐?【参考方案2】:
在python3中,略有不同:
from urllib.parse import urlencode
urlencode('pram1': 'foo', 'param2': 'bar')
输出:'pram1=foo&param2=bar'
为了兼容python2和python3,试试这个:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
【讨论】:
【参考方案3】:你正在寻找类似urllib.urlencode()
的东西正是!
但是,当您调用 parse_qs()
(与 parse_qsl()
不同)时,字典键是唯一的查询变量名称,而值是每个名称的 值列表。
为了将此信息传递给urllib.urlencode()
,您必须“展平”这些列表。以下是使用元组列表理解的方法:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
【讨论】:
或者你可以通过doseq=True
。
@downvoter:我该如何改进这个答案?我写它已经六年了!【参考方案4】:
也许你正在寻找这样的东西:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
它需要一个字典并将其转换为查询字符串,就像 urlencode 一样。它会在查询字符串中附加一个最后的“&”,但如果有问题,return query[:-1]
会解决这个问题。
【讨论】:
你见过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(your_dict)
) 比这更短更容易!我承认,重新发明***有时是明智的,即使是粗制滥造的,当使用现有的、设计良好的***很昂贵或不方便时,但在这里使用现成的***比滚动你自己的劣质***更容易、更快捷.以上是关于如何在 Python 中将字典转换为查询字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python3 中将 OrderedDict 转换为常规字典
如何在python,dataframe中将数据转换为嵌套字典
如何将afnetworking json字典转换为字符串,然后在IOS中将字符串转换为字典?