162 votes

Comment faire pour convertir un dictionnaire de chaîne de requête en Python?

Après l'utilisation de cgi.parse_qs(), comment convertir le résultat (dictionnaire) retour à la chaîne de requête? À la recherche de quelque chose de similaire urllib.urlencode().

214voto

Ignacio Vazquez-Abrams Points 312628

À partir de la documentation:

urllib.urlencode(query[, doseq])
Convertir un objet de mappage ou une séquence de deux éléments de n-uplets pour un "pour-cent-codé" chaîne... une série d' key=value paires séparées par '&' personnages...

Un dict est un mappage.

12voto

Johnsyweb Points 45395

Vous êtes à la recherche de quelque chose exactement comme urllib.urlencode()!

Toutefois, lorsque vous appelez parse_qs() (distincte parse_qsl()), le dictionnaire clés sont l'unique requête des noms de variables et les valeurs sont des listes de valeurs pour chaque nom.

Pour transmettre cette information en urllib.urlencode(), vous devez "aplatir", ces listes. Voici comment vous pouvez le faire avec une liste comprehenshion de tuples:

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

1voto

garbados Points 596

Peut-être vous cherchez quelque chose comme ceci:

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

Il prend un dictionnaire et de le convertir en une chaîne de requête, tout comme la fonction urlencode. Il va ajouter un final "&" à la chaîne de requête, mais return query[:-1] correctifs, si c'est un problème.

0voto

Alexis Benoist Points 22

Un liner:

'&'.join([str(q) + '=' + str(d[q]) for q in d])

Edit: explication: par exemple: d = {'a': 1, 'b': 2 }

[str(q) + '=' + str(d[q]) for q in d]

On itère sur les éléments (variable q) dans le dict d et nous concaténer la clé avec '=' et la valeur. Il nous donne un tableau comme ['a=1, b=2'].

'&'.join(['a=1', 'b=2'])

Nous venons de joindre les éléments de la matrice, ce qui donne 'a=1&b=2'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X