Avansert Pythonutviklingskurs
Kapittel
>
Nivå
Serialiseringsmoduler
Kompresjonsmoduler
Mål
Ta imot meldinger og ordre og komprimer dem for arkivering og overføring.
Det finnes flere konstruksjonsinstruksjoner, forsendelser og manifest som har blitt sendt inn og som må overføres eller arkiveres. Selv om disse kan sendes ut ved manuelt å sende alt, er en god metode å gjøre dette ved å komprimere og dekomprimere filer, og deretter lagre eller sende dem ut. For å gjøre dette kan du bruke komprimeringsmoduler for å redusere filstørrelser og gjøre informasjon enklere å håndtere. I motsetning til andre problemer vi løste, der vi lærte og brukte en enkelt modul, finnes det flere komprimeringsmoduler vi kan bruke med et lite utvalg av funksjoner. De er som følger:
For rask komprimeringshastighet og lav komprimering, bruk zlib-modulen, ved å legge til import zlib. For våre formål skal vi bruke følgende funksjon: zlib.compress(), som bruker ett argument, nemlig informasjonen du ønsker å komprimere. Argumentet må oppgis som bytes i stedet for en streng.
For middels komprimeringshastighet og middels komprimering, bruk bz2-modulen, ved å legge til import bz2. For våre formål skal vi bruke følgende funksjoner:
bz2.compress(), som bruker ett argument, nemlig informasjonen du ønsker å komprimere.bz2.decompress(), som bruker ett argument, nemlig informasjonen du ønsker å dekomprimere. Den må oppgis som bytes i stedet for en streng.
Argumentene må oppgis som bytes i stedet for en streng.
For høy komprimering, men lav komprimeringshastighet, bruk lzma-modulen, ved å legge til import lzma. For våre formål skal vi bruke følgende klasser og funksjoner:
lzma.LZMACompressor(): Klasse brukt til å opprette komprimeringsobjekter, slik at du kan aktivere en komprimator.compress(): bruker ett argument, nemlig informasjonen du ønsker å komprimere. Den må oppgis som bytes i stedet for en streng.
I tillegg til disse modulene vil vi bruke bytes()-funksjonen, som lar deg konvertere strenger til bytes, noe som vil være 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, og de heter red_message, blue_message og green_message. Til å begynne med, gå til den gylne X-merket over den røde løperen, og opprett en variabel som heter red_bytes. Ta red_message-konstanten og konverter meldingen til bytes slik at dataene kan komprimeres, ved å bruke bytes()-funksjonen formatert til '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, noe som vil komprimere dataene, slik: red_compression = zlib.compress(red_bytes). Når dataene er komprimert, bruk den forhåndsskrevne display()-funksjonen i kodeeditoren og legg til variablene red_message og red_compression som argumenter for å lese meldingen og se komprimeringsdataene.
Gå til den lyse X-merket over den røde løperen og vend deg mot skrivebordet, opprett to variabler som heter: message_length og compression_length. I disse variablene skal vi lagre lengden på dataene, både før og etter komprimering, ved hjelp av funksjonen len(). For eksempel, for message_length, hent lengden på red_message, slik: message_length = len(red_message). Gjør det samme for compression_length ved å lagre len()-verdien til red_compression.
Når begge variablene er fylt ut, bruk den forhåndsskrevne write()-funksjonen og sett inn message_length og compression_length som argumenter for å verifisere komprimeringsstørrelsene. Dette viser hvor mye filen er komprimert i forhold til når den er ukomprimert.
Gå til den mørke X-merket over den blå løperen, vend deg mot datamaskinen. Opprett en variabel som heter blue_bytes og konverter blue_message til bytes ved å bruke bytes()-funksjonen på samme måte som du gjorde med red_message. Ta blue_message-konstanten og komprimer den ved å lagre verdien fra bz2.compress() og sett inn blue_bytes som argument for å komprimere dataene, slik: blue_message = bz2.compress(blue_bytes).
Opprett en variabel som heter blue_decompress og lagre verdien fra bz2.decompress(), og legg til blue_message som argument for å se dataene etter dekomprimering. Legg til variablene blue_message og blue_decompress i den forhåndsskrevne display()-funksjonen for å vise både komprimerte og dekomprimerte varianter av meldingsdataene.
Gjør deg vei til den mørke X-merket over den grønne løperen og opprett et objekt som heter compressor og fyll det med lzma.LZMACompressor(). Dette vil skape et komprimeringsobjekt som kan brukes med lzma-funksjoner. Opprett en variabel som heter green_bytes og konverter green_message til bytes-format ved å bruke bytes()-funksjonen på samme måte som du gjorde med red_message og blue_message.
Opprett en variabel som heter green_compression og lagre compressor.compress() som en verdi, med green_bytes som argument. Dette lar deg komprimere meldingsdataene ved å bruke komprimeringsobjektet. Legg til variablene green_message og green_compression i den forhåndsskrevne display()-funksjonen for å se meldingen og de komprimerte dataene.
Gå til den lyse X-merket over den grønne løperen og vend deg mot skrivebordet, og endre de to variablene som heter: message_length og compression_length. I disse variablene skal vi lagre lengden på dataene, både før og etter komprimering, ved hjelp av len()-funksjonen. For message_length henter du lengden på green_message med len(). Gjør det samme for compression_length ved å lagre len() av green_compression. Når begge variablene er fylt ut, bruk den forhåndsskrevne write()-funksjonen og sett inn message_length og compression_length som argumenter for å verifisere komprimeringsstørrelsene og fullføre nivået.