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


Answers:


158

Python 3

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

映射对象或可能包含str或bytes对象的两个元素的元组序列转换百分比编码的ASCII文本字符串。

- Python的3 urllib.parse文档

A dict是一个映射。

旧版Python

urllib.urlencodequery[,doseq])
映射对象或由两个元素组成的元组序列转换 “百分比编码”字符串...一系列key=value'&'字符分隔的对...

- Python 2.7版urllib文档


1
的确如此,但是dict返回的by cgi.parse_qs()实际上将lists作为其“值”。直接传递这些将导致看起来很奇怪的查询字符串。
Johnsyweb 2011年

足够真实。那会教我多读第一句话!
Johnsyweb 2011年


问题是urlencode会将空格转换为+,不建议这样做。
user1633272

1
@ user1633272:不建议根据谁?
伊格纳西奥·巴斯克斯

65

在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

6

您正在寻找完全一样的东西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)

15
否则你可以通过doseq=True
伊格纳西奥·巴斯克斯

@downvoter:我该如何改善这个答案?我写这本书已经六年了!
Johnsyweb

-1

也许您正在寻找这样的东西:

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

它需要一个字典并将其转换为查询字符串,就像urlencode一样。它将在查询字符串后附加一个最终的“&”,但return query[:-1]如果有问题,则将其修复。


4
你见过str.join()吗 怎么urllib.quote_plus()
伊格纳西奥·巴斯克斯

1
@garbados您的解决方案应在简单的情况下起作用。但是,看看urlencodeurllib.py(它应该在你的Python安装),看看为什么创建一个查询字符串是有时不是很简单,因为你的答案意味着(尤其是需要“报价”某些字符不在有效网址)。@Ignacio还引用了两个函数,这些函数可以清理实现并使其正确。
Anthony Cramp

嗯,的确如此。对不起,执行不力。去表明我应该更加谨慎地回答我从未面对过的问题。
加尔巴多斯2011年

虽然这可能不是最好的答案,但这正是我单击该问题标题时想要看到的内容。字典中只有4个项目,我需要将其转换为以'&'分隔的name = value对。我的价值观受到控制。在我的情况下,str.join()很方便,但是我也不需要quote_plus(),因为它不是面向公众的代码:)谢谢!
harperville 2014年

1
@harperville,但是更正确的方法(from urllib.parse import urlencode; urlencode(your_dict))比这更短,更容易!我会承认,有时在造价昂贵或不方便使用现有的,设计精良的车轮时,重塑车轮有时甚至是明智的做法,但是在这里,使用现成的车轮比滚动自己的劣质车轮更容易,更快。 。
Mark Amery
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.