Wie konvertiere ich ein Wörterbuch in eine Abfragezeichenfolge in Python?
111
Nach der Verwendung cgi.parse_qs(), wie das Ergebnis (Wörterbuch) zurück zu Query - String konvertieren? Auf der Suche nach etwas ähnlichem urllib.urlencode().
Konvertieren Sie ein Zuordnungsobjekt oder eine Folge von Tupeln mit zwei Elementen, die Str- oder Byte-Objekte enthalten können, in eine prozentual codierte ASCII-Textzeichenfolge.
urllib.urlencode( query[, doseq])
Konvertieren Sie ein Zuordnungsobjekt oder eine Folge von Tupeln mit zwei Elementen in eine "prozentcodierte" Zeichenfolge ... eine Reihe von key=valuePaaren, die durch '&'Zeichen getrennt sind ...
Dies ist wahr, aber das dictzurückgegebene von hat cgi.parse_qs()tatsächlich lists als "Werte". Wenn Sie diese direkt übergeben, werden sehr seltsam aussehende Abfragezeichenfolgen erstellt.
Johnsyweb
Wahr genug. Das bringt mir bei, mehr als den ersten Satz zu lesen!
Wenn Sie jedoch parse_qs()(anders als parse_qsl()) aufrufen , sind die Wörterbuchschlüssel die eindeutigen Namen der Abfragevariablen und die Werte sind Wertelisten für jeden Namen.
Um diese Informationen weiterzugeben urllib.urlencode(), müssen Sie diese Listen "reduzieren". So können Sie es mit einer Liste von Tupeln machen:
query_pairs =[(k,v)for k,vlist in d.iteritems()for v in vlist]
urllib.urlencode(query_pairs)
Es nimmt ein Wörterbuch und konvertiert es in eine Abfragezeichenfolge, genau wie Urlencode. Es wird ein abschließendes "&" an die Abfragezeichenfolge angehängt, dies wird jedoch return query[:-1]behoben, wenn es sich um ein Problem handelt.
Hast du dich schon getroffen str.join()? Wie wäre es urllib.quote_plus()?
Ignacio Vazquez-Abrams
1
@garbados Ihre Lösung sollte in einfachen Fällen funktionieren. Schauen Sie jedoch urlencodein urllib.py(dies sollte in Ihrer Python-Installation der Fall sein) nach, warum das Erstellen einer Abfragezeichenfolge manchmal nicht ganz so einfach ist, wie es Ihre Antwort impliziert (insbesondere die Notwendigkeit, bestimmte Zeichen, die in a nicht gültig sind, in Anführungszeichen zu setzen) URL). @Ignacio hat auch auf zwei Funktionen verwiesen, die Ihre Implementierung bereinigen und korrigieren würden.
Anthony Cramp
Ah, in der Tat. Entschuldigung für die grobe Implementierung. Dies zeigt, dass ich vorsichtiger Fragen beantworten sollte, mit denen ich mich noch nie konfrontiert sah.
Garbados
Dies ist vielleicht nicht die beste Antwort, aber genau das wollte ich sehen, als ich auf den Titel dieser Frage geklickt habe. Ich habe nur 4 Elemente in einem Diktat, die ich in ein Name = Wert-Paar verwandeln muss, das durch ein '&' getrennt ist. Meine Werte werden kontrolliert. Das str.join () ist in meinem Fall praktisch, aber ich brauche kein quote_plus (), da es kein öffentlich zugänglicher Code ist :) Danke!
Harperville
1
@harperville aber der korrektere Weg ( from urllib.parse import urlencode; urlencode(your_dict)) ist kürzer und einfacher als dieser! Ich gebe zu, dass es manchmal klug ist, das Rad neu zu erfinden, selbst wenn es teuer oder unpraktisch ist, auf vorhandene, gut gestaltete Räder zuzugreifen, aber hier ist die Verwendung des Standardrads einfacher und schneller als das Rollen Ihres eigenen minderwertigen .
cgi.parse_qs()
ist veraltet. Verwenden Sie stattdessen urlparse.parse_qs ().Antworten:
Python 3
A
dict
ist eine Abbildung.Legacy Python
quelle
dict
zurückgegebene von hatcgi.parse_qs()
tatsächlichlist
s als "Werte". Wenn Sie diese direkt übergeben, werden sehr seltsam aussehende Abfragezeichenfolgen erstellt.In Python3 etwas anders:
Ausgabe:
'pram1=foo¶m2=bar'
Versuchen Sie Folgendes, um die Kompatibilität mit Python2 und Python3 zu gewährleisten:
quelle
Sie suchen genau so etwas
urllib.urlencode()
!Wenn Sie jedoch
parse_qs()
(anders alsparse_qsl()
) aufrufen , sind die Wörterbuchschlüssel die eindeutigen Namen der Abfragevariablen und die Werte sind Wertelisten für jeden Namen.Um diese Informationen weiterzugeben
urllib.urlencode()
, müssen Sie diese Listen "reduzieren". So können Sie es mit einer Liste von Tupeln machen:quelle
doseq=True
.Vielleicht suchen Sie so etwas:
Es nimmt ein Wörterbuch und konvertiert es in eine Abfragezeichenfolge, genau wie Urlencode. Es wird ein abschließendes "&" an die Abfragezeichenfolge angehängt, dies wird jedoch
return query[:-1]
behoben, wenn es sich um ein Problem handelt.quelle
str.join()
? Wie wäre esurllib.quote_plus()
?urlencode
inurllib.py
(dies sollte in Ihrer Python-Installation der Fall sein) nach, warum das Erstellen einer Abfragezeichenfolge manchmal nicht ganz so einfach ist, wie es Ihre Antwort impliziert (insbesondere die Notwendigkeit, bestimmte Zeichen, die in a nicht gültig sind, in Anführungszeichen zu setzen) URL). @Ignacio hat auch auf zwei Funktionen verwiesen, die Ihre Implementierung bereinigen und korrigieren würden.from urllib.parse import urlencode; urlencode(your_dict)
) ist kürzer und einfacher als dieser! Ich gebe zu, dass es manchmal klug ist, das Rad neu zu erfinden, selbst wenn es teuer oder unpraktisch ist, auf vorhandene, gut gestaltete Räder zuzugreifen, aber hier ist die Verwendung des Standardrads einfacher und schneller als das Rollen Ihres eigenen minderwertigen .