Curs avansat de dezvoltare în Python
Capitolul
>
Nivel
Module de serializare
Module de compresie
Obiectiv
Preia mesaje și comenzi și comprimă-le pentru arhivare și transmisie.
Există mai multe instrucțiuni de construcție, expedieri și manifeste care au fost trimise și trebuie transferate sau arhivate. Deși acestea pot fi trimise manual, o modalitate bună de a face acest lucru este prin comprimarea și decomprimarea fișierelor, apoi stocarea sau trimiterea lor. Pentru aceasta, poți folosi module de compresie pentru a micșora dimensiunea fișierelor și a face informațiile mai ușor de gestionat. Spre deosebire de alte probleme pe care le-am rezolvat și unde am învățat și am folosit un singur modul, există mai multe module de compresie pe care le putem utiliza, fiecare cu un număr restrâns de funcții. Acestea sunt următoarele:
Pentru viteză mare de compresie și compresie redusă, folosește modulul zlib, importând import zlib. Pentru scopurile noastre vom folosi următoarea funcție: zlib.compress(), care ia un argument, și anume informația pe care dorești să o comprimi. Argumentul trebuie introdus ca octeți (bytes) și nu ca șir de caractere.
Pentru viteză medie de compresie și compresie medie, folosește modulul bz2, importând import bz2. Pentru scopurile noastre vom folosi următoarele funcții:
bz2.compress(), care ia un argument, și anume informația pe care dorești să o comprimi.bz2.decompress(), care ia un argument, și anume informația pe care dorești să o decomprimi.
Argumentele trebuie introduse ca octeți (bytes) și nu ca șir de caractere.
Pentru compresie mare, dar cu viteză redusă, folosește modulul lzma, importând import lzma. Pentru scopurile noastre vom folosi următoarele clase și funcții:
lzma.LZMACompressor(): Clasă folosită pentru a crea obiecte de compresie care permit activarea unui compresor.compress(): care ia un argument, și anume informația pe care dorești să o comprimi.
Argumentele trebuie introduse ca octeți (bytes) și nu ca șir de caractere.
În plus față de aceste module, vom folosi funcția bytes() pentru a converti șirurile de caractere în bytes, ceea ce va fi util pentru compresie. Aceasta ia două argumente: șirul pe care vrei să-l convertești și formatul, care pentru scopurile noastre este 'utf-8'.
Există trei constante care conțin date ce trebuie comprimate, și anume red_message, blue_message și green_message. Pentru început, mergi la semnul X de culoare aurie de deasupra covorului roșu și creează o variabilă numită red_bytes. Ia constanta red_message și convertește mesajul în octeți astfel încât datele să poată fi comprimate, folosind funcția bytes() cu formatul 'utf-8', astfel: red_bytes = bytes(red_message, 'utf-8').
Creează o variabilă numită red_compression și stochează valoarea lui zlib.compress(). Folosește red_bytes ca argument pentru a comprima datele, astfel: red_compression = zlib.compress(red_bytes). Odată ce datele au fost comprimate, folosește funcția predefinită display() din editor și adaugă variabilele red_message și red_compression ca argumente pentru a afișa mesajul și datele comprimate.
Mergi la semnul X luminat de deasupra covorului roșu și stai cu fața la birou. Creează două variabile numite message_length și compression_length. În aceste variabile vom stoca lungimea în caractere a datelor înainte și după compresie folosind funcția len(). De exemplu, pentru message_length obține lungimea din red_message, astfel: message_length = len(red_message). Fă același lucru pentru compression_length, stocând len(red_compression).
După ce ambele variabile au fost populate, folosește funcția predefinită write() și inserează message_length și compression_length ca argumente pentru a verifica dimensiunile compresiei. Aceasta demonstrează cât de mult s-a comprimat fișierul comparativ cu starea necomprimată.
Mergi la semnul X întunecat de deasupra covorului albastru și stai cu fața la calculator. Creează o variabilă numită blue_bytes și convertește blue_message în octeți folosind funcția bytes() în aceeași manieră ca pentru red_message. Ia constanta blue_message și comprim-o stocând valoarea lui bz2.compress() și inserând blue_bytes ca argument pentru comprimare, astfel: blue_message = bz2.compress(blue_bytes).
Creează o variabilă numită blue_decompress și stochează valoarea lui bz2.decompress(), adăugând blue_message ca argument pentru a vedea datele după decomprimare. Adaugă variabilele blue_message și blue_decompress în funcția predefinită display() pentru a vizualiza variantele comprimate și decomprimate ale datelor mesajului.
Mergi la semnul X întunecat de deasupra covorului verde și creează un obiect numit compressor, populându-l cu lzma.LZMACompressor(). Acest lucru va crea un obiect compresor care poate fi folosit cu funcții lzma. Creează o variabilă numită green_bytes și transformă green_message în format de octeți folosind funcția bytes() în aceeași manieră ca pentru red_message și blue_message.
Creează o variabilă numită green_compression și stochează compressor.compress(), adăugând green_bytes ca argument. Acest lucru îți va permite să comprimi datele mesajului folosind obiectul compresor. În funcția predefinită display() adaugă variabilele green_message și green_compression ca argumente pentru a vizualiza mesajul și datele comprimate.
Mergi la semnul X luminat de deasupra covorului verde și stai cu fața la birou. Modifică cele două variabile numite message_length și compression_length. În aceste variabile vom stoca lungimea în caractere a datelor înainte și după compresie folosind funcția len(). Pentru message_length obține lungimea din green_message cu len(). Fă același lucru pentru compression_length, stocând len(green_compression). După ce ambele variabile sunt populate, folosește funcția predefinită write() și inserează message_length și compression_length ca argumente pentru a verifica dimensiunile compresiei și a termina nivelul.