Προχωρημένο Μάθημα Ανάπτυξης σε 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 μορφοποίησης που ονομάζεται pprint, το οποίο θα εισάγουμε χρησιμοποιώντας from pprint import pprint. Αυτό μας επιτρέπει να χρησιμοποιήσουμε τη συνάρτηση pprint() που μπορεί να χρησιμοποιηθεί για τη μορφοποίηση δομών δεδομένων όπως λεξικά, επιτρέποντάς μας να εμφανίζουμε τις πληροφορίες με σαφήνεια.
Για να ξεκινήσεις, περπάτησε μέχρι το φωτεινό σημάδι 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 και το protocol που αντιστοιχεί στον αριθμό στο όνομα της μεταβλητής. Για παράδειγμα, για το sereal_0 θα ορίσουμε το protocol ως 0, έτσι: sereal_0 = pickle.dumps(samples, protocol=0). Χρησιμοποιήστε τα sereal_0, sereal_2 και sereal_5 με την προγεγραμμένη συνάρτηση display() για να επαληθεύσετε πόσο διαφορετική είναι η σειριοποίηση για κάθε πρωτόκολλο.
Περπατήστε προς το φωτεινό σημάδι X πάνω στο κόκκινο χαλάμι και στρέψτε προς τον τερματικό, αντικαταστήστε τη μεταβλητή output και αποθηκεύστε την τιμή της pickle.loads() θέτοντας ως όρισμα το sereal_5 για να αποσειριοποιήσετε τα δείγματα δεδομένων που έχουν συλλεχθεί μέχρι στιγμής. Χρησιμοποιήστε τη συνάρτηση display() και προσθέστε τη συνάρτηση pprint() με τη μεταβλητή output για να δείτε τα δεδομένα. Κάπως έτσι: await player.display(pprint(output)). Σημειώστε τις αξιολογήσεις για κάθε μήνα που εμφανίζονται στον τερματικό ώστε να τις καταγράψετε αργότερα.
Περπατήστε προς το σκοτεινό σημάδι X πάνω στο κόκκινο χαλάμι και στρέψτε προς το γραφείο, στην προγεγραμμένη συνάρτηση write(), προσθέστε τις αξιολογήσεις που σημειώσατε για κάθε μήνα, οι οποίες προηγουμένως εμφανίστηκαν στον τερματικό. Προσθέστε τες ως συμβολοσειρές με τα εισαγωγικά "" στη σωστή σειρά όπως περιγράφονται στη συνάρτηση για να ολοκληρώσετε το επίπεδο.