2010-11-17 13 views
13

मैं पाइथन का उपयोग कर स्टैक ओवरफ़्लो एपीआई के साथ खेल रहा हूं। मैं एपीआई देता है कि gzipped प्रतिक्रियाओं को डीकोड करने की कोशिश कर रहा हूँ।मैं "फ़ाइल जैसी वस्तु" से GzipFile उदाहरण कैसे बना सकता हूं जो urllib.urlopen() देता है?

import urllib, gzip 

url = urllib.urlopen('http://api.stackoverflow.com/1.0/badges/name') 
gzip.GzipFile(fileobj=url).read() 

the urllib2 documentation के अनुसार, urlopen "फ़ाइल की तरह ऑब्जेक्ट"।

AttributeError: addinfourl instance has no attribute 'tell' 

जहां तक ​​मेरा बता सकते हैं, इस वस्तु urlopen द्वारा लौटाए से आ रही है:

हालांकि, जब मैं GzipFile वस्तु मैं इसे का उपयोग कर बनाए गए पृष्ठ पर read() चलाने के लिए, मैं इस त्रुटि मिलती है।

यह जब मैं यह कर या तो चाहते हैं, के रूप में मैं कोई त्रुटि मिलती है करने के लिए प्रकट नहीं होता है:

url.read() 
url.seek(0) 

वास्तव में इस वस्तु क्या है, और मैं इसे कैसे से एक कार्य GzipFile उदाहरण बना सकता हूँ?

+1

'सामग्री-एन्कोडिंग: gzip' को http लाइब्रेरी द्वारा संभाला जाना चाहिए, लेकिन दुर्भाग्यवश यह नहीं है। दिलचस्पी के लिए यह पाइथन के बग डेटाबेस में [मुद्दा 9500] (http://bugs.python.org/issue9500) है। –

+0

@ मैग्नस: चीयर्स, यह जानना अच्छा है कि यह कम से कम बग ट्रैकर में है। –

उत्तर

10

urlopen docs लौटाए गए ऑब्जेक्ट के समर्थित विधियों को सूचीबद्ध करें। मैं ऑब्जेक्ट को दूसरी कक्षा में लपेटने की अनुशंसा करता हूं जो gzip अपेक्षाओं का समर्थन करता है।

अन्य विकल्प: प्रतिक्रिया ऑब्जेक्ट की रीड विधि को कॉल करें और परिणाम को StringIO ऑब्जेक्ट में रखें (जो सभी विधियों का समर्थन करना चाहिए)। हालांकि यह शायद थोड़ा और महंगा हो सकता है।

उदा।

import gzip 
import json 
import StringIO 
import urllib 

url = urllib.urlopen('http://api.stackoverflow.com/1.0/badges/name') 
url_f = StringIO.StringIO(url.read()) 
g = gzip.GzipFile(fileobj=url_f) 
j = json.load(g) 
+0

इसे 'स्ट्रिंगियो' ऑब्जेक्ट में लपेटकर उस त्रुटि से पहले हो जाता है, लेकिन मुझे अभी भी एक 'IOError: Gzipped फ़ाइल नहीं है' –

+1

@ थॉमसके यह मेरे लिए काम करता है। क्या आप 'url.read()' को 'स्ट्रिंगियो' कन्स्ट्रक्टर या बस 'यूआरएल' में पास कर रहे हैं? उत्तरार्द्ध विफल रहता है। – aaronasterling

+0

यूप, यही वह था जो मुझे गलत लगेगा। धन्यवाद। –

8
import urllib2 
import json 
import gzip 
import io 

url='http://api.stackoverflow.com/1.0/badges/name' 
page=urllib2.urlopen(url) 
gzip_filehandle=gzip.GzipFile(fileobj=io.BytesIO(page.read())) 
json_data=json.loads(gzip_filehandle.read()) 
print(json_data) 

io.BytesIO के लिए python2.6 + है। पायथन के पुराने संस्करणों के लिए, आप cStringIO.StringIO का उपयोग कर सकते हैं।

संबंधित मुद्दे