Προχωρημένο Μάθημα Ανάπτυξης σε Python
Κεφάλαιο
>
Επίπεδο
Μονάδες σειριοποίησης
Μονάδες Συμπίεσης
Στόχος
Πάρτε μηνύματα και εντολές και συμπιέστε τα για αρχειοθέτηση και μετάδοση.
Υπάρχουν αρκετές οδηγίες κατασκευής, αποστολές και δελτία που έχουν υποβληθεί και πρέπει να μεταφερθούν ή να αρχειοθετηθούν. Αν και αυτά μπορούν να σταλούν χειροκίνητα στέλνοντας τα πάντα, ένας καλός τρόπος για να το κάνετε αυτό είναι να συμπιέσετε και να αποσυμπιέσετε αρχεία, και στη συνέχεια να τα αποθηκεύσετε ή να τα στείλετε. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε μονάδες συμπίεσης για να μειώσετε τα μεγέθη των αρχείων και να κάνετε τις πληροφορίες ευκολότερες στη διαχείριση. Σε αντίθεση με άλλα προβλήματα που επιλύσαμε, όπου μάθαμε και χρησιμοποιήσαμε μια ενιαία μονάδα, υπάρχουν αρκετές μονάδες συμπίεσης που μπορούμε να χρησιμοποιήσουμε με μια μικρή επιλογή συναρτήσεων. Αυτές είναι οι εξής:
Για γρήγορη ταχύτητα συμπίεσης και χαμηλό βαθμό συμπίεσης, χρησιμοποιήστε τη μονάδα zlib, προσθέτοντας import zlib. Για τους σκοπούς μας, θα χρησιμοποιήσουμε την ακόλουθη συνάρτηση: zlib.compress(), η οποία χρησιμοποιεί ένα όρισμα, που είναι η πληροφορία που θέλετε να συμπιέσετε. Το όρισμα πρέπει να εισαχθεί ως bytes αντί για συμβολοσειρά.
Για μέτρια ταχύτητα συμπίεσης και μέτριο βαθμό συμπίεσης, χρησιμοποιήστε τη μονάδα bz2, προσθέτοντας import bz2. Για τους σκοπούς μας, θα χρησιμοποιήσουμε τις ακόλουθες συναρτήσεις:
bz2.compress(), χρησιμοποιεί ένα όρισμα, που είναι η πληροφορία που θέλετε να συμπιέσετε.bz2.decompress(), χρησιμοποιεί ένα όρισμα, που είναι η πληροφορία που θέλετε να συμπιέσετε. Πρέπει να εισαχθεί ως bytes αντί για συμβολοσειρά.
Τα ορίσματα πρέπει να εισαχθούν ως bytes αντί για συμβολοσειρά.
Για υψηλό βαθμό συμπίεσης αλλά αργή ταχύτητα συμπίεσης, χρησιμοποιήστε τη μονάδα lzma, προσθέτοντας import lzma. Για τους σκοπούς μας, θα χρησιμοποιήσουμε τις ακόλουθες κλάσεις και συναρτήσεις:
lzma.LZMACompressor(): Κλάση που χρησιμοποιείται για τη δημιουργία αντικειμένων συμπίεσης που σας επιτρέπουν την ενεργοποίηση ενός συμπιεστή.compress(): χρησιμοποιεί ένα όρισμα, που είναι η πληροφορία που θέλετε να συμπιέσετε. Πρέπει να εισαχθεί ως bytes αντί για συμβολοσειρά. Το όρισμα πρέπει να εισαχθεί ως bytes αντί για συμβολοσειρά.
Εκτός από αυτές τις μονάδες, θα χρησιμοποιήσουμε τη συνάρτηση bytes(), που σας επιτρέπει να μετατρέπετε συμβολοσειρές σε bytes, κάτι που θα είναι χρήσιμο για τη συμπίεση. Δέχεται δύο ορίσματα, τη συμβολοσειρά που θέλετε να μετατρέψετε και τη μορφή, η οποία για τους σκοπούς μας είναι 'utf-8'.
Υπάρχουν τρεις σταθερές που περιέχουν δεδομένα που πρέπει να συμπιεστούν, οι οποίες ονομάζονται red_message, blue_message και green_message. Για αρχή, περπατήστε προς το χρυσό σημάδι X πάνω από το κόκκινο χαλί, δημιουργήστε μια μεταβλητή με το όνομα red_bytes. Πάρτε τη σταθερά red_message και μετατρέψτε το μήνυμα σε bytes ώστε τα δεδομένα να μπορέσουν να συμπιεστούν, χρησιμοποιώντας τη συνάρτηση bytes() με μορφοποίηση σε 'utf-8', ως εξής: red_bytes = bytes(red_message, 'utf-8').
Δημιουργήστε μια μεταβλητή με το όνομα red_compression και αποθηκεύστε την τιμή του zlib.compress(). Χρησιμοποιήστε το red_bytes ως όρισμα που θα συμπιέσει τα δεδομένα, ως εξής: red_compression = zlib.compress(red_bytes). Μόλις συμπιεστούν τα δεδομένα, χρησιμοποιήστε τη προ-γραμμένη συνάρτηση display() στο code editor και προσθέστε τις μεταβλητές red_message και red_compression ως ορίσματα προκειμένου να διαβάσετε το μήνυμα και να δείτε τα δεδομένα της συμπίεσης.
Περπατήστε προς το φωτεινό σημάδι X πάνω από το κόκκινο χαλί και στραφείτε προς το γραφείο, δημιουργήστε δύο μεταβλητές με τα ονόματα: message_length και compression_length. Σε αυτές τις μεταβλητές θα αποθηκεύσουμε το μήκος χαρακτήρων των δεδομένων, τόσο πριν όσο και μετά τη συμπίεση, χρησιμοποιώντας τη συνάρτηση len(). Για παράδειγμα, για το message_length πάρτε το μήκος του red_message, ως εξής: message_length = len(red_message). Κάντε το ίδιο για το compression_length αποθηκεύοντας το len() του red_compression.
Μόλις και οι δύο μεταβλητές έχουν γεμίσει, χρησιμοποιήστε τη προ-γραμμένη συνάρτηση write() και εισάγετε τα message_length και compression_length ως ορίσματα, προκειμένου να επαληθεύσετε τα μεγέθη της συμπίεσης. Αυτό δείχνει πόσο έχει συμπιεστεί το αρχείο σε σύγκριση με όταν παραμένει μη συμπιεσμένο.
Περπατήστε προς το σκοτεινό σημάδι X πάνω από το μπλε χαλί, στραφείτε προς τον υπολογιστή. Δημιουργήστε μια μεταβλητή με το όνομα blue_bytes και μετατρέψτε το blue_message σε bytes χρησιμοποιώντας τη συνάρτηση bytes() με τον ίδιο τρόπο που κάνατε με το red_message. Πάρτε τη σταθερά blue_message και συμπιέστε την αποθηκεύοντας την τιμή του bz2.compress() και εισάγοντας το blue_bytes ως όρισμα για τη συμπίεση των δεδομένων, ως εξής: blue_message = bz2.compress(blue_bytes).
Δημιουργήστε μια μεταβλητή με το όνομα blue_decompress και αποθηκεύστε την τιμή του bz2.decompress() και προσθέστε το blue_message ως όρισμα προκειμένου να δείτε τα δεδομένα μετά την αποσυμπίεση. Προσθέστε τις μεταβλητές blue_message και blue_decompress στη προ-γραμμένη συνάρτηση display() προκειμένου να δείτε τις συμπιεσμένες και αποσυμπιεσμένες παραλλαγές των δεδομένων του μηνύματος.
Προχωρήστε προς το σκοτεινό σημάδι X πάνω από το πράσινο χαλί και δημιουργήστε ένα αντικείμενο με το όνομα compressor και δώστε του τιμή lzma.LZMACompressor(), αυτό θα δημιουργήσει ένα αντικείμενο συμπίεσης που μπορεί να χρησιμοποιηθεί με τις συναρτήσεις του lzma. Δημιουργήστε μια μεταβλητή με το όνομα green_bytes και μετατρέψτε το green_message σε μορφή bytes χρησιμοποιώντας τη συνάρτηση bytes() με τον ίδιο τρόπο που χρησιμοποιήσατε για το red_message και το blue_message.
Δημιουργήστε μια μεταβλητή με το όνομα green_compression και αποθηκεύστε το compressor.compress() ως τιμή, προσθέτοντας το green_bytes ως όρισμα. Αυτό θα σας επιτρέψει να συμπιέσετε τα δεδομένα του μηνύματος χρησιμοποιώντας το αντικείμενο συμπίεσης. Στη συνάρτηση display() που έχει γραφτεί προκαταβολικά, προσθέστε τις μεταβλητές green_message και green_compression ως ορίσματα προκειμένου να δείτε το μήνυμα και τα δεδομένα της συμπίεσης.
Περπατήστε προς το φωτεινό σημάδι X πάνω από το πράσινο χαλί και στραφείτε προς το γραφείο, τροποποιήστε τις δύο μεταβλητές με τα ονόματα: message_length και compression_length. Σε αυτές τις μεταβλητές θα αποθηκεύσουμε το μήκος χαρακτήρων των δεδομένων, τόσο πριν όσο και μετά τη συμπίεση, χρησιμοποιώντας τη συνάρτηση len(). Για το message_length πάρτε το μήκος του green_message με το len(). Κάντε το ίδιο για το compression_length αποθηκεύοντας το len() του green_compression. Μόλις και οι δύο μεταβλητές έχουν γεμίσει, χρησιμοποιήστε τη προ-γραμμένη συνάρτηση write() και εισάγετε τα message_length και compression_length ως ορίσματα προκειμένου να επαληθεύσετε τα μεγέθη της συμπίεσης και να ολοκληρώσετε το επίπεδο.