2010-04-22 12 views
29

मैंने अपनी पायथन लिपि में एक वेबपृष्ठ डाउनलोड किया। ज्यादातर मामलों में, यह ठीक काम करता है।पायथन में, मैं जीजेआईपी एन्कोडिंग कैसे डीकोड करूं?

हालांकि, इस प्रतिक्रिया का शीर्षलेख था: जीजेआईपी एन्कोडिंग, और जब मैंने इस वेब पेज के स्रोत कोड को मुद्रित करने का प्रयास किया, तो मेरे पास मेरे पट्टी में सभी प्रतीकों थे।

नियमित पाठ के लिए इसे कैसे डीकोड करें?

उत्तर

64

मैं वेब से gzipped सामग्री को डिकंप्रेस करने के लिए zlib का उपयोग करता हूं।

import zlib 

... 
# f=urllib2.urlopen(url) 
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS) 
+0

आप मेरी जान बचाते हैं) – Oduvan

+3

क्या आप टिप्पणी कर सकते हैं कि डिकंप्रेस के लिए दूसरा तर्क क्या है? और ऐसा क्यों है ... अच्छा ... अजीब? – DataGreed

+1

@ डेटागाreed, दूसरा तर्क खिड़की के आकार के लिए है, कृपया नीचे जॉन माचिन का उत्तर देखें। – YOU

25

अंतर्निहित gzip मॉड्यूल का उपयोग करके अपने बाइट स्ट्रीम को डिक्रॉप करें।

आपको कोई समस्या है, तो एक साथ print repr(your_byte_stream[:100])

अधिक जानकारी

1. के परिणाम के लिए के साथ, सही कम से कम कोड है कि आप का इस्तेमाल किया, सटीक त्रुटि संदेश और ट्रैसबैक दिखाते हैं gzip/zlib/deflate भ्रम की व्याख्या, this Wikipedia article के "अन्य उपयोग" खंड को पढ़ें।

2. यदि आपके पास फ़ाइल की बजाय स्ट्रिंग है तो gzip मॉड्यूल की तुलना में zlib मॉड्यूल का उपयोग करना आसान हो सकता है। दुर्भाग्य से Python docs अधूरा/गलत कर रहे हैं:

"" " zlib.decompress (स्ट्रिंग [, wbits [, bufsize]]) ... wbits का निरपेक्ष मान के आकार के आधार दो लघुगणक है इतिहास बफर ("विंडो आकार") डेटा संपीड़ित करते समय उपयोग किया जाता है। इसका पूर्ण मान ज़्लिब लाइब्रेरी के नवीनतम संस्करणों के लिए 8 और 15 के बीच होना चाहिए, बड़े मानों के परिणामस्वरूप अधिक मेमोरी उपयोग की कीमत पर बेहतर संपीड़न होता है। डिफ़ॉल्ट मान 15 है। जब wbits नकारात्मक है, मानक gzip हेडर दबाया जाता है; यह zlib लाइब्रेरी की एक अनियंत्रित विशेषता है, जो अनजिप के संपीड़न फ़ाइल प्रारूप के साथ संगतता के लिए उपयोग की जाती है। ""

सबसे पहले, ऊपर दिए गए अर्थ के साथ, 8 < = log2_window_size < = 15। फिर शीर्ष पर एक अलग तर्क होना चाहिए:

arg == log2_window_size का मतलब है कि मान लें कि स्ट्रिंग zlib प्रारूप में है (आरएफसी 1 9 50; HTTP 1.1 आरएफसी 2616 क्या भ्रमित रूप से "डिफ्लेट" कहता है)।

आर्ग == -log2_window_size का मतलब मान स्ट्रिंग Deflate प्रारूप में है (RFC 1951; लोग हैं, जो HTTP 1.1 RFC ध्यान से वास्तव में कार्यान्वित पढ़ा नहीं था क्या)

आर्ग == 16 + log_2_window_size का मतलब मान स्ट्रिंग में है जीजीआईपी प्रारूप (आरएफसी 1 9 52)। तो आप 31.

उपर्युक्त जानकारी zlib C library manual में प्रलेखित है ... Ctrl-F windowBits के लिए खोजें।

+0

विषय पर विस्तृत जानकारी के लिए धन्यवाद। – temoto

8

मैं ऐसा ही कुछ का उपयोग करें: python3

के लिए

f = urllib2.urlopen(request) 
data = f.read() 
try: 
    from cStringIO import StringIO 
    from gzip import GzipFile 
    data2 = GzipFile('', 'r', 0, StringIO(data)).read() 
    data = data2 
except: 
    #print "decompress error %s" % err 
    pass 
return data 
3

इस

import gzip 

    fetch = opener.open(request) # basically get a response object 
    data = gzip.decompress(fetch.read()) 
    data = str(data,'utf-8') 
-1

की कोशिश आप urllib3 उपयोग कर सकते हैं आसानी से gzip डिकोड करने के लिए।

urllib3.response.decode_gzip(response.data) 
+0

यह क्यों कम किया गया है? –

+1

@ सैमप मुझे लगता है क्योंकि ऐसा नहीं है, कुछ भी समझा नहीं है। मैंने कोशिश की है कि आप निश्चित रूप से कुछ त्रुटियां प्राप्त करेंगे। यह बिल्कुल वैध जवाब नहीं है। – erm3nda

+0

मुझे बस 'अनुरोध' पैकेज पसंद है, जो स्वचालित रूप से 'gzip' को संभाल सकता है – WeizhongTu

1

python3 के लिए Shatu के जवाब की तरह, लेकिन थोड़ा अलग तरह की व्यवस्था की:

import gzip 

s = Request("https://someplace.com", None, headers) 
r = urlopen(s, None, 180).read() 
try: r = gzip.decompress(r) 
except OSError: pass 
result = json_load(r.decode()) 

इस विधि एक कोशिश में gzip.decompress() लपेटकर/छोड़कर पकड़ने और OSError पारित करने के लिए अनुमति देता है उन परिस्थितियों में परिणाम जहां आप मिश्रित संपीड़ित और असम्पीडित डेटा प्राप्त कर सकते हैं। अगर वे एन्कोड किए जाते हैं तो कुछ छोटे तार वास्तव में बड़े हो जाते हैं, इसलिए इसके बजाय सादा डेटा भेजा जाता है।

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