หลักสูตรการพัฒนาด้วย Python ขั้นสูง
บทที่
>
ระดับ
โมดูลการ Serialization
โมดูล Marshal และ Pickle
วัตถุประสงค์
ไปที่สถานีบริการและตรวจสอบให้แน่ใจว่าข้อมูลถูกจัดเก็บอย่างถูกต้องโดยใช้โมดูล JSON ในการจัดรูปแบบไฟล์
เมื่อเดินต่อไปบนเส้นทางเราจะพบสถานีบางแห่งที่ตรวจสอบการ распредел vatten และคุณภาพดินสำหรับพื้นที่ที่กำลังพัฒนาเพื่อการเก็บเกี่ยวในอนาคต เพื่อที่จะประมวลผลข้อมูลได้อย่างมีประสิทธิภาพจึงจำเป็นต้องทำการ serialization ข้อมูล ในขณะที่การใช้ Json นั้นสามารถมีประสิทธิภาพในฐานะโซลูชันทั่วไป แต่ยังมีวิธีการ serialization ที่เฉพาะเจาะจงสำหรับ Python อยู่เช่นกัน ซึ่งก็คือโมดูล Marshal และ Pickle โมดูล Marshal ถูกออกแบบมาเพื่อการ serialization/deserialization ที่รวดเร็วโดยการแปลงข้อมูลเป็นไบนารี ซึ่งเหมาะสำหรับการถ่ายโอนข้อมูลที่เรียบง่าย โมดูล Pickle แม้ว่าจะทำงานได้ช้ากว่าแต่ก็ถูกออกแบบมาเพื่อประมวลผลโครงสร้างข้อมูลที่ซับซ้อนมากขึ้นและมีความยืดหยุ่นกว่า เหมาะสำหรับโครงสร้างข้อมูลขนาดใหญ่หรือข้อมูลที่มีความสำคัญ
ในการใช้โมดูล Marshal และ Pickle ให้นำเข้าฟังก์ชันของพวกมันโดยการเขียน: import marshal และ import pickle สำหรับวัตถุประสงค์ของเราเราจะใช้ฟังก์ชันดังต่อไปนี้:
marshal.dumps(): ทำการ serialization ข้อมูลให้เป็นรูปแบบไบนารี ออกแบบมาเพื่อความรวดเร็วภายใน Python รับอาร์กิวเมนต์เพียงหนึ่งอัน นั่นคือข้อมูลที่คุณต้องการจะ serialization ซึ่งจำกัดเฉพาะประเภทข้อมูลพื้นฐานmarshal.loads(): ทำการ deserialization ข้อมูลไบนารีให้เป็นประเภทข้อมูลที่ Python อ่านได้ แม้ว่าจะมีความสามารถที่จำกัดแต่การทำงานรวดเร็ว รับอาร์กิวเมนต์เพียงหนึ่งอัน นั่นคือข้อมูลที่ต้องการจะ deserializationpickle.DEFAULT_PROTOCOL: ตรวจสอบว่า protocol สำหรับการ serialization ด้วย Pickle รุ่นไหนเป็นค่าเริ่มต้นในเวอร์ชัน Python ของคุณ Protocol แต่ละอันจะส่งผลต่อวิธีการ serialization ข้อมูลpickle.HIGHEST_PROTOCOL: ตรวจสอบว่า protocol สำหรับการ serialization ด้วย Pickle รุ่นไหนเป็นสูงสุดที่มีให้ในเวอร์ชัน Python ของคุณ Protocol แต่ละอันจะส่งผลต่อวิธีการ serialization ข้อมูลpickle.dumps(): ทำการ serialization โครงสร้างข้อมูล Python ที่ซับซ้อนให้อยู่ในรูปแบบไบนารีตาม protocol ที่ใช้ รับอาร์กิวเมนต์สองอัน คือข้อมูลที่คุณต้องการจะ serialization และเวอร์ชัน protocol ที่คุณต้องการใช้ในการ serializationpickle.loads(): ทำการ deserialization ข้อมูลไบนารีให้เป็นประเภทข้อมูลที่ Python อ่านได้ มีความสามารถในการประมวลผลอ็อบเจ็กต์ของ Python ที่ทรงพลัง รับอาร์กิวเมนต์เพียงหนึ่งอัน นั่นคือข้อมูลที่ต้องการจะ deserialization
นอกเหนือจากโมดูลและฟังก์ชันเหล่านี้แล้ว เรายังจะใช้โมดูลสำหรับการจัดรูปแบบที่ชื่อว่า pprint ซึ่งเราจะนำเข้าโดยใช้ from pprint import pprint ซึ่งจะช่วยให้เราใช้ฟังก์ชัน pprint() ที่สามารถใช้ในการจัดรูปแบบโครงสร้างข้อมูลเช่น dictionary ทำให้เราสามารถแสดงข้อมูลออกมาได้อย่างชัดเจน
เริ่มต้นที่สถานี ให้เดินไปที่เครื่องหมาย X ที่มีแสงไฟภายในสถานีตรวจสอบเล็ก ๆ แล้วหันไปทางเครื่องคอมพิวเตอร์ สถานีนี้ทำการตรวจสอบความดันน้ำและสภาพดินของพื้นที่ใกล้เคียงที่กำลังพัฒนาเพื่อปลูกพืชมีคอนสแตนต์ที่ชื่อว่า reading ซึ่งประกอบด้วยข้อมูล Python ที่รวบรวมโดยสถานี
สร้างตัวแปรที่ชื่อว่า data และเก็บค่าโดยเรียกใช้ฟังก์ชัน marshal.dumps() โดยตั้งค่าตัวแปร reading เป็นอาร์กิวเมนต์ เช่นนี้: data = marshal.dumps(reading) ใช้ตัวแปร data ร่วมกับฟังก์ชัน display() ที่เขียนไว้แล้วเพื่อดูข้อมูลตัวแปรที่ได้รับการ serialization
ออกจากสถานีและมุ่งหน้าไปที่เครื่องหมาย X สีทอง ใช้ฟังก์ชัน open() เพื่อเปิดประตูและเข้าถึงสำนักงาน เดินไปที่เครื่องหมาย X ที่มีแสงไฟด้านหน้าของเครื่องคอมพิวเตอร์และทำการ deserialization ข้อมูลที่คุณเพิ่ง serialization สร้างตัวแปรที่ชื่อว่า output และเก็บค่าที่ได้จากการเรียกใช้ฟังก์ชัน marshal.loads() โดยมีตัวแปร data เป็นอาร์กิวเมนต์ ใช้ฟังก์ชัน write() และเพิ่ม output เป็นอาร์กิวเมนต์เพื่อเข้าถึงข้อมูลที่ได้รับการ serialization จากสถานีตรวจสอบ
เดินไปที่เครื่องหมาย X ที่มีแสงไฟบนพรมสีฟ้าในสำนักงาน ที่เครื่องคอมพิวเตอร์เราจะทำการตรวจสอบ protocol เพื่อระบุว่าการ serialization ด้วยโมดูล pickle จะใช้รูปแบบใด ในฟังก์ชัน write() ที่เขียนไว้แล้ว ให้ตั้งค่าอาร์กิวเมนต์เป็น pickle.DEFAULT_PROTOCOL และ pickle.HIGHEST_PROTOCOL ซึ่งจะเป็นการตรวจสอบว่า protocol การ serialization ปัจจุบันคืออะไรและ protocol การ serialization ล่าสุดที่มีให้ในขณะนี้คืออะไร
เดินไปยังเครื่องหมาย X สีเข้มบนพรมสีฟ้า ตอนนี้หลังจากที่เราได้ยืนยัน protocol แล้ว เราสามารถตรวจสอบข้อมูลที่จัดเก็บไว้ได้ ข้อมูลได้ถูกเก็บและจัดเก็บตลอดหลายเดือนและถูกเก็บไว้ในคอนสแตนต์ที่ชื่อว่า samples สร้างตัวแปรสามตัวที่มีชื่อว่า: sereal_0 , sereal_2 และ sereal_5 เราจะใช้ตัวแปรเหล่านี้เพื่อทำการตรวจสอบ protocol สามแบบที่มีให้สำหรับการ serialization Protocol 0 เป็นรูปแบบ ASCII ที่อ่านได้ แม้จะไม่มีประสิทธิภาพ Protocol 2 เป็นรูปแบบไบนารีที่มีประสิทธิภาพมากกว่า และ Protocol 5 เป็น protocol ล่าสุดที่มีคุณสมบัติซับซ้อนมากที่สุด
เราจะเก็บค่าที่ได้จาก pickle.dumps() และตั้งค่าให้อาร์กิวเมนต์เป็นคอนสแตนต์ samples และ protocol ที่สอดคล้องกับเลขที่อยู่ในชื่อตัวแปร ตัวอย่างเช่น สำหรับ sereal_0 เราจะตั้งค่า protocol เป็น 0 เช่นนี้: sereal_0 = pickle.dumps(samples, protocol=0) ใช้ตัวแปร sereal_0 , sereal_2 และ sereal_5 ร่วมกับฟังก์ชัน display() ที่เขียนไว้แล้วเพื่อทำการตรวจสอบความแตกต่างของการ serialization สำหรับแต่ละ protocol
เดินไปที่เครื่องหมาย X ที่มีแสงไฟบนพรมสีแดงและหันไปที่เครื่องคอมพิวเตอร์ ทำการเขียนทับตัวแปร output และเก็บค่าที่ได้จาก pickle.loads() โดยตั้งค่าอาร์กิวเมนต์เป็น sereal_5 เพื่อทำการ deserialization ข้อมูลตัวอย่างที่รวบรวมมา ใช้ฟังก์ชัน display() และเพิ่มฟังก์ชัน pprint() พร้อมกับตัวแปร output เพื่อดูข้อมูลออกมา เช่นนี้: await player.display(pprint(output)) ให้จดบันทึกค่าการให้คะแนนสำหรับแต่ละเดือนที่แสดงในเครื่องคอมพิวเตอร์เพื่อให้คุณสามารถจดบันทึกไว้ในภายหลัง
เดินไปที่เครื่องหมาย X สีเข้มบนพรมสีแดงและหันไปที่โต๊ะ ในฟังก์ชัน write() ที่เขียนไว้แล้ว ให้เพิ่มค่าการให้คะแนนที่คุณได้บันทึกไว้สำหรับแต่ละเดือน ซึ่งแสดงไว้ในเครื่องคอมพิวเตอร์ในลำดับที่ถูกต้องตามที่ระบุไว้ในฟังก์ชันเพื่อให้ระดับการทดสอบสมบูรณ์