Προχωρημένο Μάθημα Ανάπτυξης 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 και το 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() και πρόσθεσε τη συνάρτηση pformat() με τη μεταβλητή output προκειμένου να δεις τα δεδομένα. Όπως εξής: await player.display(pformat(output)). Σημείωσε τις βαθμολογίες για κάθε μήνα που εμφανίζονται στον τερματικό υπολογιστή ώστε να τις καταγράψεις αργότερα.

Περπάτησε στο σκούρο σημάδι X πάνω από το κόκκινο χαλί και αντιμετώπισε το γραφείο. Στην προκαθορισμένη συνάρτηση write(), πρόσθεσε τις βαθμολογίες που σημείωσες για κάθε μήνα, οι οποίες εμφανίστηκαν προηγουμένως στον τερματικό υπολογιστή. Πρόσθεσέ τες ως συμβολοσειρές με διπλά εισαγωγικά "" στη σωστή σειρά όπως ορίζεται στη συνάρτηση, προκειμένου να ολοκληρώσεις το επίπεδο.

Βιβλίο Κώδικα