Python 3.7

lzma - LZMA एल्गोरिथ्म का उपयोग कर संपीड़न




python

lzma - LZMA एल्गोरिथ्म का उपयोग कर संपीड़न

संस्करण 3.3 में नया।

स्रोत कोड: Lib/lzma.py

यह मॉड्यूल LZMA संपीड़न एल्गोरिथ्म का उपयोग करके डेटा को संपीड़ित और डिकम्प्रेस करने के लिए कक्षाएं और सुविधा फ़ंक्शन प्रदान करता है। इसमें एक फ़ाइल इंटरफ़ेस भी शामिल है जो .xz और विरासत का समर्थन करता है। .xz फ़ाइल प्रारूप जो xz उपयोगिता द्वारा उपयोग किया जाता है, साथ ही कच्चे संपीड़ित धाराएं भी।

इस मॉड्यूल द्वारा दिया गया इंटरफ़ेस bz2 मॉड्यूल के समान है। हालाँकि, ध्यान दें कि LZMAFile विपरीत थ्रेड-सुरक्षित नहीं है , इसलिए यदि आपको कई थ्रेड्स में से एक LZMAFile इंस्टेंस का उपयोग करने की आवश्यकता है, तो इसे लॉक से सुरक्षित करना आवश्यक है।

exception lzma.LZMAError

यह अपवाद तब उठाया जाता है जब संपीड़न या डीकंप्रेसन के दौरान कोई त्रुटि उत्पन्न होती है, या कंप्रेसर / डीकंप्रेसर स्थिति को इनिशियलाइज़ करते समय।

संकुचित फ़ाइलों को पढ़ना और लिखना

lzma.open(filename, mode="rb", *, format=None, check=-1, preset=None, filters=None, encoding=None, errors=None, newline=None)

एक LZMA- संपीड़ित फ़ाइल को बाइनरी या टेक्स्ट मोड में खोलें, एक फ़ाइल ऑब्जेक्ट लौटाता है।

फ़ाइल नाम तर्क या तो एक वास्तविक फ़ाइल नाम हो सकता है (एक str , bytes या path-like ऑब्जेक्ट के रूप में दिया गया है), जिस स्थिति में नामित फ़ाइल को खोला जाता है, या यह पढ़ने या लिखने के लिए एक मौजूदा फ़ाइल ऑब्जेक्ट हो सकता है।

मोड तर्क "r" , "rb" , "w" , "wb" , "x" , "xb" , "a" या बाइनरी मोड के लिए "ab" या "rt" , "wt" , "xt" , या "at" पाठ मोड के लिए। डिफ़ॉल्ट "rb"

पढ़ने के लिए एक फ़ाइल खोलते समय, प्रारूप और फ़िल्टर तर्क का एक ही अर्थ होता है जैसे कि LZMADecompressor । इस मामले में, चेक और प्रीसेट तर्क का उपयोग नहीं किया जाना चाहिए।

लेखन के लिए एक फ़ाइल खोलते समय, प्रारूप , चेक , प्रीसेट और फ़िल्टर तर्क का एक ही अर्थ होता है जैसे कि LZMACompressor

बाइनरी मोड के लिए, यह फ़ंक्शन LZMAFile कंस्ट्रक्टर के समान है: LZMAFile(filename, mode, ...) । इस स्थिति में, एन्कोडिंग , त्रुटियों और newline तर्क प्रदान नहीं किया जाना चाहिए।

पाठ मोड के लिए, एक LZMAFile ऑब्जेक्ट बनाया जाता है, और निर्दिष्ट एन्कोडिंग, त्रुटि हैंडलिंग व्यवहार और लाइन एंडिंग (एस) के साथ एक io.TextIOWrapper उदाहरण में लपेटा जाता है।

संस्करण 3.4 में परिवर्तित: "x" , "xb" और "xt" मोड के लिए जोड़ा गया समर्थन।

संस्करण 3.6 में परिवर्तित: एक path-like स्वीकार करता path-like

class lzma.LZMAFile(filename=None, mode="r", *, format=None, check=-1, preset=None, filters=None)

बाइनरी मोड में एक LZMA-संकुचित फाइल खोलें।

एक LZMAFile पहले से खुली हुई फ़ाइल ऑब्जेक्ट को लपेट सकता है, या सीधे किसी नामित फ़ाइल पर काम कर सकता है। फ़ाइल नाम तर्क या तो फ़ाइल ऑब्जेक्ट को रैप करने के लिए निर्दिष्ट करता है, या फ़ाइल का नाम खोलने के लिए (एक str , bytes या path-like ऑब्जेक्ट के रूप में)। किसी मौजूदा फ़ाइल ऑब्जेक्ट को LZMAFile समय, LZMAFile बंद होने पर लपेटी गई फ़ाइल बंद नहीं होगी।

मोड तर्क या तो पढ़ने के लिए "r" हो सकता है (डिफ़ॉल्ट), ओवर राइटिंग के लिए "w" , अनन्य निर्माण के लिए "x" या एप्लाइड के लिए "a" । इन्हें क्रमशः "rb" , "wb" , "xb" और "ab" रूप में दिया जा सकता है।

यदि फ़ाइल नाम एक फ़ाइल ऑब्जेक्ट (वास्तविक फ़ाइल नाम के बजाय) है, तो "w" का एक मोड फ़ाइल को छोटा नहीं करता है, और इसके बजाय "a" बराबर है।

पढ़ने के लिए एक फ़ाइल खोलते समय, इनपुट फ़ाइल कई अलग-अलग संपीड़ित धाराओं का संयोजन हो सकती है। ये पारदर्शी रूप से एकल तार्किक धारा के रूप में डिकोड किए जाते हैं।

पढ़ने के लिए एक फ़ाइल खोलते समय, प्रारूप और फ़िल्टर तर्क का एक ही अर्थ होता है जैसे कि LZMADecompressor । इस मामले में, चेक और प्रीसेट तर्क का उपयोग नहीं किया जाना चाहिए।

लेखन के लिए एक फ़ाइल खोलते समय, प्रारूप , चेक , प्रीसेट और फ़िल्टर तर्क का एक ही अर्थ होता है जैसे कि LZMACompressor

LZMAFile detach() io.BufferedIOBase द्वारा निर्दिष्ट सभी सदस्यों का समर्थन io.BufferedIOBase , केवल detach() और io.BufferedIOBase detach() को छोड़कर। कथन और कथन के with समर्थित हैं।

निम्नलिखित विधि भी प्रदान की जाती है:

peek(size=-1)

फ़ाइल स्थिति को आगे बढ़ाए बिना बफर डेटा लौटाएं। जब तक EOF तक नहीं पहुंच जाता है, तब तक कम से कम एक बाइट डेटा लौटाया जाएगा। लौटे बाइट्स की सटीक संख्या अनिर्दिष्ट है ( आकार तर्क की अनदेखी की गई है)।

ध्यान दें

जबकि कॉलिंग peek() LZMAFile की फ़ाइल स्थिति को नहीं बदलता है, यह अंतर्निहित फ़ाइल ऑब्जेक्ट की स्थिति को बदल सकता है (जैसे कि फ़ाइल नाम के लिए फ़ाइल ऑब्जेक्ट पास करके LZMAFile का निर्माण किया गया था)।

संस्करण 3.4 में परिवर्तित: "x" और "xb" मोड के लिए जोड़ा गया समर्थन।

संस्करण 3.5 में बदला गया: read() विधि अब None तर्क को स्वीकार करता है।

संस्करण 3.6 में परिवर्तित: एक path-like स्वीकार करता path-like

स्मृति में डेटा को संपीड़ित और विघटित करना

class lzma.LZMACompressor(format=FORMAT_XZ, check=-1, preset=None, filters=None)

एक कंप्रेसर ऑब्जेक्ट बनाएं, जिसका उपयोग डेटा को संक्षिप्त रूप से संपीड़ित करने के लिए किया जा सकता है।

डेटा का एक एकल हिस्सा संपीड़ित करने के अधिक सुविधाजनक तरीके के लिए, compress()

प्रारूप तर्क निर्दिष्ट करता है कि किस कंटेनर प्रारूप का उपयोग किया जाना चाहिए। संभावित मूल्य हैं:

  • FORMAT_XZ: The .xz container format.
    यह डिफ़ॉल्ट प्रारूप है।
  • FORMAT_ALONE: The legacy .lzma container format.
    यह प्रारूप .xz तुलना में अधिक सीमित है - यह अखंडता जांच या कई फिल्टर का समर्थन नहीं करता है।
  • FORMAT_RAW: A raw data stream, not using any container format.
    यह प्रारूप निर्दिष्टकर्ता अखंडता जांच का समर्थन नहीं करता है, और इसके लिए आवश्यक है कि आप हमेशा एक कस्टम फ़िल्टर श्रृंखला (संपीडन और अपघटन दोनों के लिए) निर्दिष्ट करें। इसके अतिरिक्त, इस तरीके से संपीड़ित डेटा FORMAT_AUTO ( LZMADecompressor देखें) का उपयोग करके विघटित नहीं किया जा सकता है।

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

  • CHECK_NONE : कोई अखंडता जाँच नहीं। FORMAT_ALONE और FORMAT_RAW लिए यह डिफ़ॉल्ट (और केवल स्वीकार्य मान) है।
  • CHECK_CRC32 : 32-बिट चक्रीय अतिरेक जाँच।
  • CHECK_CRC64 : 64-बिट चक्रीय अतिरेक जाँच। यह FORMAT_XZ लिए डिफ़ॉल्ट है।
  • CHECK_SHA256 : 256-बिट सिक्योर हैश एल्गोरिथम।

यदि निर्दिष्ट चेक समर्थित नहीं है, तो एक LZMAError उठाया जाता है।

संपीड़न सेटिंग्स को पूर्व निर्धारित संपीड़न स्तर ( प्रीसेट तर्क के साथ) के रूप में या कस्टम फ़िल्टर श्रृंखला ( फ़िल्टर तर्क के साथ) के रूप में विस्तार से निर्दिष्ट किया जा सकता है।

पूर्व निर्धारित तर्क (यदि प्रदान किया गया है) 0 और 9 (समावेशी) के बीच पूर्णांक होना चाहिए, वैकल्पिक PRESET_EXTREME साथ वैकल्पिक रूप से OR-ed। यदि न तो प्रीसेट और न ही फिल्टर दिए गए हैं, तो डिफ़ॉल्ट व्यवहार PRESET_DEFAULT (प्रीसेट स्तर 6 ) का उपयोग करना है। उच्च प्रीसेट्स छोटे आउटपुट का उत्पादन करते हैं, लेकिन कम्प्रेशन प्रक्रिया को धीमा बनाते हैं।

ध्यान दें

अधिक सीपीयू-गहन होने के अलावा, उच्च प्रीसेट के साथ संपीड़न के लिए बहुत अधिक मेमोरी की आवश्यकता होती है (और आउटपुट उत्पन्न करता है जिसे डिकम्प्रेस करने के लिए अधिक मेमोरी की आवश्यकता होती है)। उदाहरण के लिए प्रीसेट 9 साथ, एक LZMACompressor ऑब्जेक्ट के लिए ओवरहेड 800 MiB जितना अधिक हो सकता है। इस कारण से, आमतौर पर डिफ़ॉल्ट प्रीसेट के साथ रहना सबसे अच्छा है।

फ़िल्टर तर्क (यदि प्रदान किया गया है) फ़िल्टर श्रृंखला विनिर्देशक होना चाहिए। विवरण के लिए कस्टम फ़िल्टर श्रृंखला निर्दिष्ट करना देखें।

compress(data)

कम से कम इनपुट के लिए संपीड़ित डेटा युक्त bytes ऑब्जेक्ट लौटाते हुए डेटा (एक bytes ऑब्जेक्ट) को संपीड़ित करें। कुछ डेटा आंतरिक रूप से बफ़र किए जा सकते हैं, बाद में कॉल के लिए compress() और flush() । लौटाए गए डेटा को compress() करने के लिए किसी भी पिछले कॉल के आउटपुट के साथ समतल होना चाहिए।

flush()

संपीड़न प्रक्रिया को समाप्त करें, कंप्रेसर के आंतरिक बफ़र्स में संग्रहीत किसी भी डेटा वाले bytes ऑब्जेक्ट को वापस करना।

इस विधि को कॉल करने के बाद कंप्रेसर का उपयोग नहीं किया जा सकता है।

class lzma.LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)

एक डिकम्प्रेसर ऑब्जेक्ट बनाएं, जिसका उपयोग डेटा को क्रमागत रूप से डिकम्प्रेस करने के लिए किया जा सकता है।

एक बार में संपूर्ण संपीड़ित स्ट्रीम को डिकम्प्रेस करने के अधिक सुविधाजनक तरीके के लिए, decompress()

प्रारूप तर्क कंटेनर प्रारूप को निर्दिष्ट करता है जिसका उपयोग किया जाना चाहिए। डिफ़ॉल्ट FORMAT_AUTO , जो .xz और .lzma दोनों .xz को .lzma कर सकता है। अन्य संभावित मान FORMAT_XZ , FORMAT_ALONE और FORMAT_RAW

संस्मरण तर्क स्मृति की मात्रा पर एक सीमा (बाइट्स में) निर्दिष्ट करता है जो डिकम्प्रेसर उपयोग कर सकता है। जब इस तर्क का उपयोग किया जाता है, तो विघटन LZMAError साथ विफल हो जाएगा यदि दिए गए मेमोरी सीमा के भीतर इनपुट को विघटित करना संभव नहीं है।

फ़िल्टर तर्क उस फ़िल्टर श्रृंखला को निर्दिष्ट करता है जिसका उपयोग स्ट्रीम को विघटित करने के लिए किया गया था। यह तर्क आवश्यक है यदि प्रारूप FORMAT_RAW , लेकिन इसका उपयोग अन्य प्रारूपों के लिए नहीं किया जाना चाहिए। फ़िल्टर श्रृंखला के बारे में अधिक जानकारी के लिए कस्टम फ़िल्टर श्रृंखला निर्दिष्ट करना देखें।

ध्यान दें

यह वर्ग LZMAFile decompress() और LZMAFile विपरीत, कई संपीड़ित धाराओं वाले इनपुट को पारदर्शी रूप से नहीं LZMAFile LZMADecompressor साथ मल्टी-स्ट्रीम इनपुट को LZMADecompressor , आपको प्रत्येक स्ट्रीम के लिए एक नया LZMADecompressor बनाना होगा।

decompress(data, max_length=-1)

डीकंप्रेस डेटा (एक बाइट्स जैसी वस्तु ), बाइट के रूप में असम्पीडित डेटा लौटाता है। कुछ डेटा आंतरिक रूप से बफ़र किए जा सकते हैं, बाद में कॉल करने के लिए decompress() में उपयोग किए जा सकते हैं। लौटाए गए डेटा को decompress() में किसी भी पिछले कॉल के आउटपुट के साथ समाहित किया जाना चाहिए।

यदि max_length nonnegative है, तो decompressed डेटा के अधिकांश max_length बाइट्स पर लौटता है। यदि यह सीमा समाप्त हो जाती है और आगे का उत्पादन किया जा सकता है, तो needs_input विशेषता False सेट हो जाएगी। इस स्थिति में, आउटपुट को और अधिक प्राप्त करने के लिए अगली कॉल decompress() b'' रूप में डेटा प्रदान कर सकती है।

यदि इनपुट डेटा के सभी विघटित हो गए थे और वापस आ गए (या तो क्योंकि यह needs_input बाइट्स की तुलना में कम था, या क्योंकि needs_input नकारात्मक थी), needs_input विशेषता True सेट हो जाएंगी।

स्ट्रीम के अंत के बाद डेटा को EOFError करने का प्रयास एक EOFError उठाता है। स्ट्रीम के अंत के बाद पाया गया कोई भी डेटा unused_data और unused_data विशेषता में सहेजा जाता है।

संस्करण 3.5 में बदला गया : अधिकतम_प्रत्यक्ष पैरामीटर जोड़ा गया।

check

इनपुट स्ट्रीम द्वारा उपयोग की गई अखंडता जांच की आईडी। यह तब तक CHECK_UNKNOWN हो सकता है जब तक कि यह सुनिश्चित करने के लिए कि इनपुट का कितना डिकोड हो गया है, यह क्या अखंडता CHECK_UNKNOWN

eof

True अगर अंत-स्ट्रीम स्ट्रीम तक पहुँच गया है।

unused_data

संपीड़ित स्ट्रीम के अंत के बाद डेटा मिला।

धारा के अंत तक पहुंचने से पहले, यह b""

needs_input

यदि नया असम्पीडित इनपुट की आवश्यकता से पहले decompress() विधि अधिक विघटित डेटा प्रदान कर सकती है तो False

संस्करण 3.5 में नया।

lzma.compress(data, format=FORMAT_XZ, check=-1, preset=None, filters=None)

संपीड़ित डेटा (एक bytes ऑब्जेक्ट) को संपीड़ित डेटा को bytes ऑब्जेक्ट के रूप में वापस bytes

LZMACompressor को प्रारूप के विवरण, जांच , पूर्व निर्धारित और फ़िल्टर तर्क के लिए देखें।

lzma.decompress(data, format=FORMAT_AUTO, memlimit=None, filters=None)

डीकंप्रेस डेटा (एक bytes ऑब्जेक्ट), एक bytes ऑब्जेक्ट के रूप में असम्पीडित डेटा को लौटाता है।

यदि डेटा कई अलग-अलग संपीड़ित धाराओं का संयोजन है, तो इन सभी धाराओं को विघटित करें, और परिणामों के संघटन को वापस लौटाएं।

LZMADecompressor को प्रारूप , संस्मरण और फ़िल्टर तर्क के विवरण के लिए ऊपर देखें।

कई तरह का

lzma.is_check_supported(check)

यदि इस सिस्टम पर दी गई अखंडता जाँच का समर्थन किया जाता है तो यह सही है।

CHECK_NONE और CHECK_CRC32 हमेशा समर्थित हैं। CHECK_CRC64 और CHECK_SHA256 अनुपलब्ध हो सकता है यदि आप एक सीमित सुविधा सेट के साथ संकलित किए गए liblzma के संस्करण का उपयोग कर रहे हैं।

कस्टम फ़िल्टर श्रृंखला निर्दिष्ट करना

एक फ़िल्टर श्रृंखला विनिर्देशक शब्दकोशों का एक क्रम है, जहाँ प्रत्येक शब्दकोश में एक फ़िल्टर के लिए आईडी और विकल्प होते हैं। प्रत्येक शब्दकोश में कुंजी "id" होनी चाहिए, और फ़िल्टर-निर्भर विकल्पों को निर्दिष्ट करने के लिए अतिरिक्त कुंजी हो सकती है। मान्य फ़िल्टर आईडी निम्नानुसार हैं:

  • संपीड़न फिल्टर:
    • FILTER_LZMA1 ( FILTER_LZMA1 साथ उपयोग के लिए)
    • FILTER_LZMA2 ( FORMAT_XZ और FORMAT_RAW साथ उपयोग के लिए)
  • डेल्टा फ़िल्टर:
    • FILTER_DELTA
  • ब्रांच-कॉल-जंप (BCJ) फ़िल्टर:
    • FILTER_X86
    • FILTER_IA64
    • FILTER_ARM
    • FILTER_ARMTHUMB
    • FILTER_POWERPC
    • FILTER_SPARC

एक फ़िल्टर श्रृंखला में अधिकतम 4 फ़िल्टर हो सकते हैं, और खाली नहीं हो सकते। श्रृंखला में अंतिम फ़िल्टर एक संपीड़न फ़िल्टर होना चाहिए, और किसी भी अन्य फ़िल्टर को डेल्टा या BCJ फ़िल्टर होना चाहिए।

संपीड़न फ़िल्टर निम्नलिखित विकल्पों का समर्थन करते हैं (फ़िल्टर का प्रतिनिधित्व करने वाले शब्दकोश में अतिरिक्त प्रविष्टियों के रूप में निर्दिष्ट):

  • preset : स्पष्ट रूप से निर्दिष्ट नहीं किए गए विकल्पों के लिए डिफ़ॉल्ट मानों के स्रोत के रूप में उपयोग करने के लिए एक पूर्व निर्धारित संपीड़न।
  • dict_size : बाइट्स में डिक्शनरी का आकार। यह 4 KiB और 1.5 GiB (सम्मिलित) के बीच होना चाहिए।
  • lc : शाब्दिक संदर्भ बिट्स की संख्या।
  • lp : शाब्दिक स्थिति बिट्स की संख्या। योग lc + lp अधिकतम 4 पर होना चाहिए।
  • pb : स्थिति बिट्स की संख्या; अधिकतम 4 पर होना चाहिए।
  • mode : MODE_FAST या MODE_NORMAL
  • nice_len : जिसे एक मैच के लिए "अच्छी लंबाई" माना जाना चाहिए। यह 273 या उससे कम होना चाहिए।
  • mf : किस खोजक का उपयोग करना है - MF_HC3 , MF_HC4 , MF_BT2 , MF_BT3 , या MF_BT4
  • depth : मैच खोजक द्वारा उपयोग की जाने वाली अधिकतम खोज गहराई। 0 (डिफ़ॉल्ट) का अर्थ है अन्य फ़िल्टर विकल्पों के आधार पर स्वचालित रूप से चयन करना।

डेल्टा फ़िल्टर बाइट्स के बीच अंतरों को संग्रहीत करता है, कुछ परिस्थितियों में कंप्रेसर के लिए अधिक दोहरावदार इनपुट का उत्पादन करता है। यह एक विकल्प, दूर का समर्थन करता है। यह बाइट्स के बीच की दूरी को घटाए जाने का संकेत देता है। डिफ़ॉल्ट 1 है, अर्थात आसन्न बाइट्स के बीच के अंतरों को लें।

BCJ फ़िल्टर मशीन कोड पर लागू किए जाने का इरादा है। वे कोडिंग में रिडंडेंसी को बढ़ाने के उद्देश्य से रिलेटेड एड्रेसिंग का उपयोग करने के लिए कोड में रिलेटिव ब्रांच, कॉल और जंपर्स को कन्वर्ट करते हैं। ये फ़िल्टर एक विकल्प का समर्थन करते हैं, start_offset । यह उस पते को निर्दिष्ट करता है जिसे इनपुट डेटा की शुरुआत में मैप किया जाना चाहिए। डिफ़ॉल्ट 0 है।

उदाहरण

एक संपीड़ित फ़ाइल में पढ़ना:

import lzma
with lzma.open("file.xz") as f:
    file_content = f.read()

एक संपीड़ित फ़ाइल बनाना:

import lzma
data = b"Insert Data Here"
with lzma.open("file.xz", "w") as f:
    f.write(data)

स्मृति में डेटा संपीड़ित करना:

import lzma
data_in = b"Insert Data Here"
data_out = lzma.compress(data_in)

वृद्धिशील संपीड़न:

import lzma
lzc = lzma.LZMACompressor()
out1 = lzc.compress(b"Some data\n")
out2 = lzc.compress(b"Another piece of data\n")
out3 = lzc.compress(b"Even more data\n")
out4 = lzc.flush()
# Concatenate all the partial results:
result = b"".join([out1, out2, out3, out4])

पहले से खुली फ़ाइल में संपीड़ित डेटा लिखना:

import lzma
with open("file.xz", "wb") as f:
    f.write(b"This data will not be compressed\n")
    with lzma.open(f, "w") as lzf:
        lzf.write(b"This *will* be compressed\n")
    f.write(b"Not compressed\n")

कस्टम फ़िल्टर श्रृंखला का उपयोग करके एक संपीड़ित फ़ाइल बनाना:

import lzma
my_filters = [
    {"id": lzma.FILTER_DELTA, "dist": 5},
    {"id": lzma.FILTER_LZMA2, "preset": 7 | lzma.PRESET_EXTREME},
]
with lzma.open("file.xz", "w", filters=my_filters) as f:
    f.write(b"blah blah blah")