Προχωρημένο Μάθημα Ανάπτυξης σε Python
Κεφάλαιο
>
Επίπεδο
Μονάδες Αποσειριοποίησης
Μονάδες Marshal και Pickle
Στόχος
Πηγαίνετε στο σταθμό υπηρεσιών και βεβαιωθείτε ότι τα δεδομένα αποθηκεύονται σωστά χρησιμοποιώντας το module JSON για τη μορφοποίηση των αρχείων.
Συνεχίζοντας στον δρόμο, βρίσκουμε μερικούς σταθμούς που παρακολουθούν την κατανομή του νερού και την ποιότητα του εδάφους για τη γη που αναπτύσσεται για μελλοντική σοδειά. Για την επεξεργασία των δεδομένων είναι αποδοτικό να σειριοποιούνται. Ενώ η χρήση του Json μπορεί να είναι αποτελεσματική ως γενική λύση, υπάρχουν επίσης μερικές μέθοδοι σειριοποίησης ειδικές για την Python, όπως τα modules Marshal και Pickle. Το module Marshal έχει σχεδιαστεί για ταχεία σειριοποίηση/αποσειριοποίηση μετατρέποντας τα δεδομένα σε δυαδική μορφή, ιδανικό για απλές μεταφορές δεδομένων. Το module Pickle είναι πιο αργό αλλά έχει σχεδιαστεί για την επεξεργασία πιο σύνθετων δομών δεδομένων και είναι πολύ πιο ευέλικτο, ιδανικό για μεγαλύτερες ή πιο κρίσιμες δομές δεδομένων.
Για να χρησιμοποιήσετε τα modules Marshal και Pickle, εισάγετε τις συναρτήσεις τους γράφοντας: import marshal και import pickle. Για τους σκοπούς μας, θα χρησιμοποιήσουμε τις ακόλουθες συναρτήσεις:
marshal.dumps(): Σειριοποιεί τα δεδομένα σε δυαδική μορφή, σχεδιασμένη για ταχύτητα εντός της Python. Δέχεται ένα επιχείρημα, που είναι τα δεδομένα που επιθυμείτε να σειριοποιήσετε, και περιορίζεται σε βασικούς τύπους δεδομένων.marshal.loads(): Αποσειριοποιεί δυαδικά δεδομένα σε αναγνώσιμους τύπους δεδομένων της Python, με περιορισμένες δυνατότητες αλλά γρήγορη εκτέλεση. Δέχεται ένα επιχείρημα, που είναι τα δεδομένα που επιθυμείτε να αποσειριοποιήσετε.pickle.DEFAULT_PROTOCOL: Ελέγχει ποια έκδοση του πρωτοκόλλου για σειριοποίηση Pickle είναι προεπιλεγμένη στη συγκεκριμένη έκδοση της Python σας. Τα πρωτόκολλα επηρεάζουν τη σειριοποίηση των δεδομένων.pickle.HIGHEST_PROTOCOL: Ελέγχει ποια έκδοση του πρωτοκόλλου για σειριοποίηση Pickle είναι η υψηλότερη διαθέσιμη στη συγκεκριμένη έκδοση της Python σας. Τα πρωτόκολλα επηρεάζουν τη σειριοποίηση των δεδομένων.pickle.dumps(): Σειριοποιεί σύνθετες δομές δεδομένων της Python σε δυαδική μορφή σύμφωνα με το χρησιμοποιούμενο πρωτόκολλο. Δέχεται δύο επιχειρήματα, τα δεδομένα που θέλετε να σειριοποιήσετε και την έκδοση του πρωτοκόλλου που θέλετε να χρησιμοποιήσετε κατά τη σειριοποίηση.pickle.loads(): Αποσειριοποιεί δυαδικά δεδομένα σε αναγνώσιμους τύπους δεδομένων της Python, με ισχυρές δυνατότητες για αντικείμενα Python. Δέχεται ένα επιχείρημα, που είναι τα δεδομένα που θέλετε να αποσειριοποιήσετε.
Εκτός από αυτά τα modules και τις συναρτήσεις, θα χρησιμοποιήσουμε επίσης ένα module μορφοποίησης με όνομα pformat, το οποίο θα εισάγουμε χρησιμοποιώντας from pprint import pformat. Αυτό μας επιτρέπει να χρησιμοποιήσουμε τη συνάρτηση pformat(), η οποία μπορεί να μορφοποιήσει δομές δεδομένων όπως λεξικά, επιτρέποντάς μας να εμφανίζουμε τις πληροφορίες με σαφήνεια.
Για να ξεκινήσετε, περπατήστε προς το φωτεινό σημάδι X μέσα στον μικρό σταθμό παρακολούθησης και στραφείτε προς τον υπολογιστή. Ο σταθμός παρακολουθεί την πίεση του νερού και τις συνθήκες του εδάφους στο κοντινό έδαφος που αναπτύσσεται για καλλιέργεια. Υπάρχει μια σταθερά με όνομα reading, η οποία περιέχει δεδομένα Python που έχουν συλλεχθεί από τον σταθμό.
Δημιουργήστε μια μεταβλητή με όνομα data και αποθηκεύστε σε αυτήν την τιμή της συνάρτησης marshal.dumps() με ως επιχείρημα το reading. Κάτι σαν αυτό: data = marshal.dumps(reading). Χρησιμοποιήστε τη μεταβλητή data με την προγεγραμμένη συνάρτηση display() για να προβείτε στα σειριοποιημένα δεδομένα της μεταβλητής.
Βγείτε από τον σταθμό και κατευθυνθείτε προς το χρυσό σημάδι X, χρησιμοποιήστε τη συνάρτηση open() για να ανοίξετε την πόρτα και να αποκτήσετε πρόσβαση στο γραφείο. Περπατήστε προς το φωτεινό σημάδι X μπροστά από τον τερματικό και αποσειριοποιήστε τα δεδομένα που μόλις σειριοποιήσατε. Δημιουργήστε μια μεταβλητή με όνομα output και αποθηκεύστε σε αυτήν την τιμή της συνάρτησης marshal.loads() με το προηγούμενο επιχείρημα data. Χρησιμοποιήστε τη συνάρτηση write() και προσθέστε το output ως επιχείρημα για να αποκτήσετε πρόσβαση στα σειριοποιημένα δεδομένα που συλλέχθηκαν από τον σταθμό παρακολούθησης.
Περπατήστε προς το φωτεινό σημάδι X πάνω από το μπλε χαλί στο γραφείο. Στον τερματικό θα επαληθεύσουμε τα πρωτόκολλα για να καθορίσουμε ποιο είδος σειριοποίησης θα χρησιμοποιήσει το module pickle κατά την επεξεργασία των δεδομένων. Στην προγεγραμμένη συνάρτηση write(), ορίστε τα επιχειρήματα ως pickle.DEFAULT_PROTOCOL και pickle.HIGHEST_PROTOCOL. Αυτό θα επαληθεύσει ποιο είναι το τρέχον πρωτόκολλο σειριοποίησης καθώς και το τελευταίο πρωτόκολλο σειριοποίησης που είναι διαθέσιμο αυτή τη στιγμή.
Μετακινηθείτε προς το σκοτεινό σημάδι X πάνω από το μπλε χαλί, τώρα που επιβεβαιώσαμε τα πρωτόκολλα, μπορούμε να επαληθεύσουμε τα αποθηκευμένα δεδομένα. Τα δεδομένα έχουν συλλεχθεί και αποθηκευτεί κατά τη διάρκεια των μηνών και βρίσκονται σε μια σταθερά με όνομα samples. Δημιουργήστε τρεις μεταβλητές με ονόματα: sereal_0, sereal_2 και sereal_5, τις οποίες θα χρησιμοποιήσουμε για να επαληθεύσουμε τρία από τα διαθέσιμα πρωτόκολλα σειριοποίησης. Το πρωτόκολλο 0 είναι αναγνώσιμο ASCII, όχι πολύ αποδοτικό, το πρωτόκολλο 2 είναι μια πιο αποδοτική δυαδική μορφή και το πρωτόκολλο 5 είναι το τελευταίο με τα πιο σύνθετα χαρακτηριστικά.
Θα αποθηκεύσουμε την τιμή της συνάρτησης pickle.dumps() και θα ορίσουμε ως επιχειρήματα τη σταθερά samples και το πρωτόκολλο που αντιστοιχεί στον αριθμό της μεταβλητής. Για παράδειγμα, για το sereal_0 θα ορίσουμε το πρωτόκολλο ως 0, όπως εδώ: sereal_0 = pickle.dumps(samples, protocol=0). Χρησιμοποιήστε τα sereal_0, sereal_2 και sereal_5 με την προγεγραμμένη συνάρτηση display() για να επαληθεύσετε πόσο διαφορετική είναι η σειριοποίηση για κάθε πρωτόκολλο.
Περπατήστε προς το φωτεινό σημάδι X πάνω από το κόκκινο χαλί και στραφείτε προς τον τερματικό, αντικαταστήστε τη μεταβλητή output και αποθηκεύστε σε αυτήν την τιμή της συνάρτησης pickle.loads() με το sereal_5 ως επιχείρημα, για να αποσειριοποιήσετε τα δεδομένα του δείγματος που έχουν συλλεχθεί μέχρι στιγμής. Χρησιμοποιήστε τη συνάρτηση display() και προσθέστε τη συνάρτηση pformat() με τη μεταβλητή output ώστε να δείτε τα δεδομένα. Κάτι σαν αυτό: await player.display(pformat(output)). Σημειώστε τις αξιολογήσεις για κάθε μήνα που εμφανίζονται στον τερματικό ώστε να τις καταγράψετε αργότερα.
Περπατήστε προς το σκοτεινό σημάδι X πάνω από το κόκκινο χαλί και στραφείτε προς το γραφείο. Στην προγεγραμμένη συνάρτηση write(), προσθέστε τις αξιολογήσεις που σημειώσατε για κάθε μήνα, οι οποίες είχαν προηγουμένως εμφανιστεί στον τερματικό. Προσθέστε τις ως συμβολοσειρές με εισαγωγικά "" με τη σωστή σειρά όπως περιγράφεται στη συνάρτηση, για να ολοκληρώσετε το επίπεδο.