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