Προχωρημένο Μάθημα Ανάπτυξης 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() στον επεξεργαστή κώδικα και προσθέστε τις μεταβλητές 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 ως ορίσματα, προκειμένου να επαληθεύσετε τα μεγέθη συμπίεσης και να ολοκληρώσετε το επίπεδο.