2010-03-11 15 views
30

मैं एक स्मृति और डिस्क सीमित वातावरण जहां मैं (xmlrpc बाइनरी स्थानांतरण से अधिक) स्ट्रिंग आधारित मात्रा में जिस एक gzip फ़ाइल की सामग्री को संपीड़ित करने की जरूरत है। हालांकि, gzip.decompress() या zlib.decompressobj()/decompress() gzip शीर्षलेख पर दोनों बार्फ़ का उपयोग कर। मैंने gzip शीर्षलेख (दस्तावेज here) को ऑफ़सेट करने का प्रयास किया है, लेकिन अभी भी बार्फ़ से बचने में कामयाब नहीं रहा है। Gzip लाइब्रेरी केवल फाइलों से डिकंप्रेस करने का समर्थन करती है।अजगर decompressing gzip हिस्सा द्वारा हिस्सा

निम्नलिखित स्निपेट मैं करना चाहते हैं क्या की एक सरल उदाहरण देता है (वास्तविक जीवन में सिवाय बफर, xmlrpc से भरा जाएगा बल्कि एक स्थानीय फ़ाइल से पढ़ने की तुलना में): के रूप में

#! /usr/bin/env python 

import zlib 

CHUNKSIZE=1000 

d = zlib.decompressobj() 

f=open('23046-8.txt.gz','rb') 
buffer=f.read(CHUNKSIZE) 

while buffer: 
    outstr = d.decompress(buffer) 
    print(outstr) 
    buffer=f.read(CHUNKSIZE) 

outstr = d.flush() 
print(outstr) 

f.close() 

दुर्भाग्य से, मैंने कहा, इस के साथ barfs:

Traceback (most recent call last): 
    File "./test.py", line 13, in <module> 
    outstr = d.decompress(buffer) 
zlib.error: Error -3 while decompressing: incorrect header check 

सैद्धांतिक रूप से, मैं एक StringIO में मेरी xmlrpc-sourced डेटा फ़ीड सकता है और उसके बाद का उपयोग करें कि gzip.GzipFile() के लिए एक fileobj के रूप में, हालांकि, वास्तविक जीवन में, मैं ' स्मृति में पूरी फ़ाइल सामग्री को साथ ही टी में रखने के लिए मेमोरी उपलब्ध नहीं है उन्होंने डेटा को डिकंप्रेस किया। मुझे वास्तव में इसे खंड-दर-खंड को संसाधित करने की आवश्यकता है।

पतन-बैक मेरे xmlrpc-sourced डेटा को gzip से plain zibib तक संपीड़ित करना होगा, लेकिन इससे अन्य उप-प्रणालियों पर असर पड़ता है, यदि संभव हो तो मैं इससे बचना पसंद करूंगा।

कोई विचार?

उत्तर

38

gzip और zlib थोड़ा अलग हेडर का उपयोग करें।

देखें How can I decompress a gzip stream with zlib?

d = zlib.decompressobj(16+zlib.MAX_WBITS) की कोशिश करो।

और तुम 2 के एक शक्ति के लिए अपने हिस्से का आकार बदलने की कोशिश कर सकते (जैसे कि CHUNKSIZE=1024) संभव प्रदर्शन कारणों से।

+0

कि यह पूरी तरह से किया था। धन्यवाद। (अब, क्यों नहीं अजगर डॉक्स में इस संकेत है?) – user291294

+4

zlib zlib की ग संस्करण चारों ओर सिर्फ एक आवरण है। यह बिल्कुल अच्छी तरह से प्रलेखित नहीं है। आपको याद है, 16 + zlib.MAX_WBITS को सी संस्करण को दस्तावेज नहीं किया गया है, और यह पहली बार नहीं है जब मैंने एक अनियंत्रित zlib सुविधा देखी है। – wisty

+0

निश्चित रूप से दस्तावेज होने की आवश्यकता है! – Ross

3

मैं एक अधिक विस्तृत जवाब यहाँ मिल गया है: https://stackoverflow.com/a/22310760/1733117

d = zlib.decompressobj(zlib.MAX_WBITS|32) 

per documentation this automatically detects the header (zlib or gzip)

+0

मैं आपको डाउनवोट नहीं करना चाहता, लेकिन यह मेरे लिए काम नहीं करता है। – gwg

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