176

I am trying to convert a Python dictionary to a string for use as URL parameters. I am sure that there is a better, more Pythonic way of doing this. What is it?

x = ""
for key, val in {'a':'A', 'b':'B'}.items():
    x += "%s=%s&" %(key,val)
x = x[:-1]
0

5 Answers 5

331

Use urllib.parse.urlencode(). It takes a dictionary of key-value pairs, and converts it into a form suitable for a URL (e.g., key1=val1&key2=val2).

For your example:

>>> import urllib.parse
>>> params = {'a':'A', 'b':'B'}
>>> urllib.parse.urlencode(params)
'a=A&b=B'

If you want to make a URL with repetitive params such as: p=1&p=2&p=3 you have two options:

>>> a = (('p',1),('p',2), ('p', 3))
>>> urllib.parse.urlencode(a)
'p=1&p=2&p=3'

or:

>>> urllib.parse.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'

If you are still using Python 2, use urllib.urlencode().

Sign up to request clarification or add additional context in comments.

4 Comments

if you want to make a url with repetitive params for example: ?p=1&p=2&p=3 then a = (('p',1),('p',2), ('p', 3)); urllib.urlencode(a) the result is 'p=1&p=2&p=3'
Another way to get repetitive params: urllib.urlencode({'p': [1, 2, 3]}, doseq=True) resulting in 'p=1&p=2&p=3'.
If you wonder what doeseq is about: "If any values in the query arg are sequences and doseq is true, each sequence element is converted to a separate parameter."
Python3 users: urllib.parse.urlencode()
44

For python 3, the urllib library has changed a bit, now you have to do:

from urllib.parse import urlencode


params = {'a':'A', 'b':'B'}

urlencode(params)

1 Comment

Note: This is one of those annoying imports where it cannot be done as import urllib and then urllib.parse. It must be done as import urllib.parse.
21

Here is the correct way of using it in Python 3.

from urllib.parse import urlencode
params = {'a':'A', 'b':'B'}
print(urlencode(params))

2 Comments

Since python 2 is now deprecated I would accept this answer but stack overflow is preventing me from changing the accepted answer.
How is this different from my answer which was ~ a year earlier before this one?
3

Use the 3rd party Python url manipulation library furl:

f = furl.furl('')
f.args = {'a':'A', 'b':'B'}
print(f.url) # prints ... '?a=A&b=B'

If you want repetitive parameters, you can do the following:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'

2 Comments

Where do I get furl? It appears not to be a standard library
pip install furl Its not a part of standard library
-11

This seems a bit more Pythonic to me, and doesn't use any other modules:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])

1 Comment

This won't percent encode the parameters properly. This will create unexpected results if your data includes ampersands, equals, hash symbols, etc.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.