Avansert Python-utviklingskurs
Kapittel
>
Nivå
Serialiseringsmoduler
Komprimeringsmoduler
Mål
Ta meldinger og ordre og komprimer dem for arkivering og overføring.
Det finnes flere byggeinstruksjoner, forsendelser og manifest som er levert inn og som må overføres eller arkiveres. Selv om disse kan sendes manuelt, er en god måte å gjøre dette på å komprimere og dekomprimere filer før lagring eller overføring. For å gjøre dette kan du bruke komprimeringsmoduler for å redusere filstørrelser og gjøre informasjonen enklere å håndtere. I motsetning til andre oppgaver vi har løst der vi lærte og brukte én enkelt modul, finnes det flere komprimeringsmoduler vi kan bruke med et lite utvalg funksjoner. Disse er som følger:
For rask komprimeringshastighet og lav kompresjon, bruk zlib-modulen ved å legge til import zlib. Til våre formål vil vi bruke følgende funksjon: zlib.compress(), som tar ett argument, nemlig informasjonen du ønsker å komprimere. Argumentet må oppgis som bytes i stedet for en tekststreng.
For middels komprimeringshastighet og middels kompresjon, bruk bz2-modulen ved å legge til import bz2. Til våre formål vil vi bruke følgende funksjoner:
bz2.compress(), tar ett argument, nemlig informasjonen du ønsker å komprimere.bz2.decompress(), tar ett argument, nemlig informasjonen du ønsker å dekomprimere. Det må oppgis som bytes i stedet for en streng.
Argumenter må oppgis som bytes i stedet for en streng.
For høy kompresjon, men lav komprimeringshastighet, bruk lzma-modulen ved å legge til import lzma. Til våre formål vil vi bruke følgende klasser og funksjoner:
lzma.LZMACompressor(): Klasse som brukes til å opprette komprimeringsobjekter som lar deg aktivere en kompressor.compress(): tar ett argument, nemlig informasjonen du ønsker å komprimere. Det må oppgis som bytes i stedet for en streng.
I tillegg til disse modulene vil vi bruke funksjonen bytes(), som lar deg konvertere strenger til bytes, noe som er nyttig for komprimering. Den tar to argumenter: strengen du ønsker å konvertere og formatet, som for våre formål er 'utf-8'.
Det finnes tre konstanter som inneholder data som må komprimeres, kalt red_message, blue_message og green_message. For å starte, gå til det gyldne X-merket over det røde teppet, og opprett en variabel som heter red_bytes. Ta konstanten red_message og konverter meldingen til bytes slik at dataene kan komprimeres ved å bruke funksjonen bytes() med formatet 'utf-8', slik: red_bytes = bytes(red_message, 'utf-8').
Opprett en variabel som heter red_compression og lagre verdien fra zlib.compress(). Bruk red_bytes som argument for å komprimere dataene, slik: red_compression = zlib.compress(red_bytes). Når dataene er komprimert, bruk den forhåndsskrevne funksjonen display() i kodeditoren og legg til variablene red_message og red_compression som argumenter for å lese meldingen og vise komprimeringsdataene.
Gå til det lyse X-merket over det røde teppet og vend deg mot pulten, og opprett to variabler kalt message_length og compression_length. I disse variablene skal vi lagre tegnlengden til dataene både før og etter komprimering ved hjelp av funksjonen len(). For message_length henter du for eksempel lengden på red_message, slik: message_length = len(red_message). Gjør det samme for compression_length ved å lagre len(red_compression).
Når begge variablene er fylt, bruk den forhåndsskrevne funksjonen write() og sett inn message_length og compression_length som argumenter for å verifisere komprimeringsstørrelsene. Dette viser hvor mye filen er komprimert sammenlignet med når den er ukomprimert.
Gå til det mørke X-merket over det blå teppet og vend deg mot datamaskinen. Opprett en variabel kalt blue_bytes og konverter blue_message til bytes ved å bruke funksjonen bytes() på samme måte som med red_message. Ta konstanten blue_message og komprimer den ved å lagre verdien fra bz2.compress() med blue_bytes som argument, slik: blue_message = bz2.compress(blue_bytes).
Opprett en variabel kalt blue_decompress og lagre verdien fra bz2.decompress() og legg til blue_message som argument for å vise dataene etter dekomprimering. Legg til variablene blue_message og blue _decompress i den forhåndsskrevne funksjonen display() for å se komprimerte og dekomprimerte varianter av meldingsdataene.
Gå til det mørke X-merket over det grønne teppet og opprett et objekt kalt compressor og fyll det med lzma.LZMACompressor(). Dette vil opprette et komprimeringsobjekt som kan brukes med lzma-funksjoner. Opprett en variabel kalt green_bytes og konverter green_message til bytes-format ved å bruke funksjonen bytes() på samme måte som du gjorde med red_message og blue message.
Opprett en variabel kalt green_compression og lagre compressor.compress() som verdi, med green_bytes som argument. Dette lar deg komprimere meldingsdataene ved hjelp av komprimeringsobjektet. I den forhåndsskrevne funksjonen display() legger du til variablene green_message og green_compression som argumenter for å vise meldingen og de komprimerte dataene.
Gå til det lyse X-merket over det grønne teppet og vend deg mot pulten, og endre de to variablene kalt message_length og compression_length. I disse variablene skal vi lagre tegnlengden til dataene både før og etter komprimering ved hjelp av funksjonen len(). For message_length henter du lengden på green_message med len(). Gjør det samme for compression_length ved å lagre len(green_compression). Når begge variablene er fylt, bruker du den forhåndsskrevne funksjonen write() og setter inn message_length og compression_length som argumenter for å verifisere komprimeringsstørrelsene og fullføre nivået.