पायथन में क्वेरी स्ट्रिंग में शब्दकोश कैसे परिवर्तित करें?


112

उपयोग करने के बाद cgi.parse_qs(), परिणाम (शब्दकोश) को वापस क्वेरी स्ट्रिंग में कैसे परिवर्तित करें? कुछ इसी तरह की तलाश में urllib.urlencode()



इन्हें भी देखें: stackoverflow.com/questions/5607551/…
dreftymac

जवाबों:


158

अजगर ३

urllib.parse.urlencode(क्वेरी, डोज़क = गलत, [...])

मैपिंग ऑब्जेक्ट या टू-एलिमेंट टुपल्स का एक सिक्वेंस कन्वर्ट करें , जिसमें str या बाइट ऑब्जेक्ट्स हो सकते हैं, जो एक प्रतिशत एनकोडेड ASCII टेक्स्ट स्ट्रिंग के लिए है।

- पायथन 3 urllib.parseडॉक्स

A dictमानचित्रण है।

लिगेसी पायथन

urllib.urlencode( query[, doseq]]) एक मैपिंग ऑब्जेक्ट या दो-तत्व ट्यूपल्स के एक अनुक्रम को "प्रतिशत-एन्कोडेड" स्ट्रिंग में
परिवर्तित करें ... पात्रों द्वारा अलग किए गए जोड़े की एक श्रृंखला ...key=value'&'

- पायथन 2.7 urllibडॉक्स


1
यह सच है, लेकिन वास्तव में इसके "मूल्यों" के रूप में dictलौटा है । इन स्ट्रेट को पास करने पर बहुत ही अजीब लगने वाले क्वेरी स्ट्रिंग्स होंगे। cgi.parse_qs()list
जॉन्सवेब

आधी हकीकत। वह मुझे पहले वाक्य से अधिक पढ़ना सिखाएगा!
जॉन्सवेब


समस्या यह है कि urlencode अंतरिक्ष को + में बदल देगा, जिसकी अनुशंसा नहीं की जाती है।
user1633272

1
@ user1633272: किसके अनुसार अनुशंसित नहीं?
इग्नासियो वाज़क्वेज़-अब्राम्स

65

अजगर 3 में, थोड़ा अलग:

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: मैं इस उत्तर को कैसे सुधार सकता हूं? इसे लिखे हुए मुझे छह साल हो चुके हैं!
जॉन्सवेब

-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 आपके समाधान को सरल मामलों में काम करना चाहिए। हालांकि, एक नजर है urlencodeमें urllib.py(यह अपने अजगर में से स्थापित करना चाहिए) क्यों बनाने क्वेरी स्ट्रिंग कभी कभी काफी सरल रूप में के रूप में अपने जवाब का अर्थ है (विशेष रूप से की जरूरत नहीं है को देखने के लिए करने के लिए 'बोली' कुछ अक्षर हैं जो एक में मान्य नहीं हैं यूआरएल)। @ इग्नासियो ने दो कार्यों को भी संदर्भित किया है जो आपके कार्यान्वयन को साफ करेंगे और इसे सही करेंगे।
एंथनी क्रैम्प

आह, वास्तव में। क्रूडली कार्यान्वयन के लिए क्षमा करें। यह दिखाने के लिए जाता है कि मुझे उन सवालों के जवाब देने में अधिक सावधानी बरतनी चाहिए जो मैंने खुद कभी नहीं झेले हैं।
गरबा

हालांकि यह सबसे अच्छा जवाब नहीं हो सकता है, यह वही है जो मैं देखना चाहता था जब मैंने इस प्रश्न के शीर्षक पर क्लिक किया था। मेरे पास केवल 4 आइटम हैं एक तानाशाह में जिसे मुझे एक 'और' द्वारा अलग किए गए नाम = मूल्य जोड़ी में बदलने की आवश्यकता है। मेरे मूल्य नियंत्रित हैं। Str.join () मेरे मामले में आसान है, लेकिन मुझे फिर से quot_plus () की कोई आवश्यकता नहीं है, क्योंकि यह सार्वजनिक-सामना करने वाला कोड नहीं है :) धन्यवाद!
हार्पर्विल

1
@harperville लेकिन अधिक सही तरीका ( from urllib.parse import urlencode; urlencode(your_dict)) इससे छोटा और आसान है! मैं अनुदान देता हूँ कि यह कभी-कभी पहिया को सुदृढ़ करने के लिए भी स्मार्ट होता है, यहाँ तक कि जब यह मौजूदा, अच्छी तरह से डिज़ाइन किए गए पहियों तक पहुँचने के लिए महंगा या असुविधाजनक होता है, लेकिन यहाँ ऑफ-द-शेल्फ व्हील का उपयोग करना आसान है और अपने स्वयं के अवर को रोल करने की तुलना में तेज है ।
मार्क अमेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.