หลักสูตรการพัฒนา Python ขั้นสูง
บทที่
>
ระดับ
โมดูลการซีเรียลไลซ์
โมดูล Marshal และ Pickle
วัตถุประสงค์
ไปยังสถานีบริการและตรวจสอบให้มั่นใจว่าข้อมูลถูกจัดเก็บอย่างถูกต้องโดยใช้โมดูล JSON เพื่อจัดรูปแบบไฟล์
เมื่อเดินต่อไปตามเส้นทาง เราจะพบสถานีบางแห่งที่ตรวจสอบการกระจายน้ำและคุณภาพดินสำหรับพื้นที่ที่กำลังพัฒนาเพื่อการเก็บเกี่ยวในอนาคต ในการประมวลผลข้อมูล การจัดอนุกรมข้อมูล (serialization) จะทำได้อย่างมีประสิทธิภาพโดยการแปลงข้อมูลให้เหมาะสม แม้ว่าการใช้ JSON จะเป็นวิธีแก้ทั่วไปที่มีประสิทธิภาพ แต่ยังมีวิธีการจัดอนุกรมที่เฉพาะเจาะจงใน Python ได้แก่ โมดูล Marshal และ Pickle โมดูล Marshal ถูกออกแบบมาเพื่อการจัดอนุกรม/ถอดอนุกรมอย่างรวดเร็วโดยการแปลงข้อมูลเป็นไบนารี เหมาะสำหรับการส่งข้อมูลที่เรียบง่าย โมดูล Pickle ช้ากว่า แต่ถูกออกแบบมาเพื่อประมวลผลโครงสร้างข้อมูลที่ซับซ้อนกว่าและมีความยืดหยุ่นมากกว่า เหมาะสำหรับโครงสร้างข้อมูลขนาดใหญ่หรือสำคัญ
ในการใช้โมดูล Marshal และ Pickle ให้ import ฟังก์ชันโดยเขียนว่า: 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 รับอาร์กิวเมนต์หนึ่งตัวคือข้อมูลที่จะถอดอนุกรม
นอกจากโมดูลและฟังก์ชันเหล่านี้ เรายังจะใช้โมดูลจัดรูปแบบชื่อ pformat ซึ่งเราจะ import โดยใช้ 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 สีสว่างบนพรมสีน้ำเงินในห้องทำงาน บนเทอร์มินอลเราจะตรวจสอบโปรโตคอลเพื่อกำหนดว่าชนิดการจัดอนุกรมใดที่โมดูล 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)) จดบันทึกคะแนน (ratings) สำหรับแต่ละเดือนที่แสดงในเทอร์มินอล เพื่อที่คุณจะได้บันทึกภายหลัง
เดินไปที่เครื่องหมาย X สีมืดบนพรมสีแดงและหันหน้าเข้าหาโต๊ะ บนฟังก์ชัน write() ที่เตรียมไว้ล่วงหน้า ให้เพิ่มคะแนนที่คุณจดบันทึกไว้สำหรับแต่ละเดือน ซึ่งเคยแสดงในเทอร์มินอล โดยเพิ่มเป็นสตริงที่มีเครื่องหมาย "" ในลำดับที่ถูกต้องตามที่ระบุในฟังก์ชัน เพื่อทำให้ภารกิจในระดับนี้เสร็จสมบูรณ์