2013-08-07 6 views
10

पर फ़ाइल करने के लिए संलग्न करना क्या पाइथन का उपयोग करके फ्लाई पर एक gzipped टेक्स्ट फ़ाइल को जोड़ना संभव है?पायथन Gzip - फ्लाई

मूल रूप से मैं यह कर रहा हूं: -

import gzip 
content = "Lots of content here" 
f = gzip.open('file.txt.gz', 'a', 9) 
f.write(content) 
f.close() 

एक लाइन जोड़ दिया जाता है फाइल करने के लिए (ध्यान दें "संलग्न") हर 6 सेकंड या तो है, लेकिन परिणामी फ़ाइल बस के रूप में एक मानक असम्पीडित फ़ाइल के रूप में बड़ा है (लगभग 1 एमबी पूरा होने पर)।

स्पष्टीकरण स्तर को स्पष्ट रूप से निर्दिष्ट करने से कोई फर्क नहीं पड़ता है।

यदि मैं बाद में एक मौजूदा असंपीड़ित फ़ाइल को gzip करता हूं, तो इसका आकार लगभग 80kb तक आता है।

मैं अनुमान लगाता हूं कि फ्लाई पर एक gzip फ़ाइल में "संलग्न" करना संभव नहीं है और इसे संपीड़ित किया गया है?

क्या यह स्ट्रिंग.आईओ बफर को लिखने का एक मामला है और फिर पूरा होने पर एक gzip फ़ाइल में flushing है?

+4

gzip एल्गोरिदम के लिए कुशलता से काम करने के लिए, इसे संपीड़ित करने के लिए पूरी सामग्री पर हाथ प्राप्त करना होगा। अन्यथा, आप केवल gzipped सामग्री के भाग संलग्न कर रहे हैं जिनके पास एक-दूसरे के साथ कुछ लेना देना नहीं है। – Nadh

+0

@Nadh तो मुझे लगता है कि मेरी आखिरी पंक्ति सही है? एक String.IO लिखें और gzip करने के लिए फ्लश? –

+1

हां, यह काम करना चाहिए। आपको बस यह सुनिश्चित करना होगा कि सभी सामग्री किसी भी समय एक साथ gzipped है। – Nadh

उत्तर

9

यह एक वैध gzip फ़ाइल बनाने और बनाए रखने के अर्थ में काम करता है, क्योंकि gzip प्रारूप concatenated gzip streams को अनुमति देता है।

हालांकि यह इस अर्थ में काम नहीं करता है कि आपको लुसी संपीड़न मिलता है, क्योंकि आप gzip संपीड़न के प्रत्येक उदाहरण को काम करने के लिए बहुत कम डेटा दे रहे हैं। संपीड़न पिछले डेटा के इतिहास का लाभ उठाने पर निर्भर करता है, लेकिन यहां gzip अनिवार्य रूप से कोई नहीं दिया गया है।

आप या तो ए) फ़ाइल में एक और जीजीआईपी स्ट्रीम जोड़ने के लिए gzip को आमंत्रित करने से पहले, कम से कम कुछ के डेटा, आपके कई लाइनों को जमा कर सकते हैं, या बी) कुछ और अधिक परिष्कृत करें जो एक एकल gzip स्ट्रीम में संलग्न होता है , प्रत्येक बार एक मान्य gzip स्ट्रीम छोड़कर और डेटा के कुशल संपीड़न की अनुमति।

आपको सी का उदाहरण मिलता है, सी में gzlog.h और gzlog.c में। मुझे विश्वास नहीं है कि पाइथन में पाइथन में सीधे gzlog को लागू करने के लिए आवश्यक सभी इंटरफेस हैं, लेकिन आप पाइथन से सी कोड में इंटरफ़ेस कर सकते हैं।