หลักสูตรการพัฒนา Python ขั้นสูง
บทที่
>
ระดับ
โมดูลการอนุกรมข้อมูล
โมดูลการบีบอัด
วัตถุประสงค์
นำข้อความและคำสั่งมาบีบอัด เพื่อจัดเก็บเป็นคลังและส่งต่อ
มีคำสั่งการก่อสร้าง การจัดส่ง และบัญชีรายการสินค้าหลายรายการที่ถูกส่งมาและจำเป็นต้องโอนย้ายหรือจัดเก็บไว้ ในขณะที่สามารถส่งออกเองได้ วิธีที่ดีคือการบีบอัดและขยายไฟล์ก่อนจัดเก็บหรือส่งออก เพื่อทำให้การจัดการไฟล์ง่ายขึ้น โดยใช้โมดูลบีบอัดเพื่อลดขนาดไฟล์ ต่างจากปัญหาอื่นที่เราแก้โดยใช้โมดูลตัวเดียว ในระดับนี้เราจะใช้โมดูลบีบอัดหลายตัวพร้อมฟังก์ชันบางส่วน มีดังนี้:
สำหรับความเร็วการบีบอัดสูงและระดับการบีบอัดต่ำ ให้ใช้โมดูล zlib โดยเพิ่ม import zlib ในโค้ด สำหรับจุดประสงค์ของเรา เราจะใช้ฟังก์ชันต่อไปนี้: zlib.compress() ซึ่งรับอาร์กิวเมนต์เดียวคือข้อมูลที่ต้องการบีบอัด โดยอาร์กิวเมนต์ต้องเป็นไบต์ ไม่ใช่สตริง
สำหรับความเร็วการบีบอัดระดับกลางและอัตราการบีบอัดระดับกลาง ให้ใช้โมดูล bz2 โดยเพิ่ม import bz2 สำหรับจุดประสงค์ของเรา เราจะใช้ฟังก์ชันดังต่อไปนี้:
bz2.compress()ใช้อาร์กิวเมนต์หนึ่งตัวคือข้อมูลที่ต้องการบีบอัดbz2.decompress()ใช้อาร์กิวเมนต์หนึ่งตัวคือข้อมูลที่ต้องการขยาย (decompression) โดยอาร์กิวเมนต์ต้องเป็นไบต์ ไม่ใช่สตริง
อาร์กิวเมนต์ต้องเป็นไบต์ ไม่ใช่สตริง
สำหรับอัตราการบีบอัดสูงแต่ความเร็วช้า ให้ใช้โมดูล lzma โดยเพิ่ม import lzma สำหรับจุดประสงค์ของเรา เราจะใช้คลาสและฟังก์ชันดังต่อไปนี้:
lzma.LZMACompressor(): คลาสที่ใช้สร้างออบเจ็กต์คอมเพรสเซอร์ เพื่อเรียกใช้งานตัวบีบอัดข้อมูลcompress(): ใช้อาร์กิวเมนต์หนึ่งตัวคือข้อมูลที่ต้องการบีบอัด โดยอาร์กิวเมนต์ต้องเป็นไบต์ ไม่ใช่สตริง
นอกจากนี้ เรายังจะใช้ฟังก์ชัน bytes() ซึ่งช่วยแปลงสตริงเป็นไบต์ เพื่อใช้ในการบีบอัด ฟังก์ชันนี้รับอาร์กิวเมนต์สองตัว คือ สตริงที่ต้องการแปลง และฟอร์แมต ซึ่งในกรณีนี้คือ 'utf-8'
มีคอนสแตนต์สามตัวที่เก็บข้อมูลซึ่งต้องบีบอัด ชื่อว่า red_message, blue_message และ green_message เริ่มต้นให้เดินไปยังเครื่องหมาย X สีทองเหนือพรมสีแดง แล้วสร้างตัวแปรชื่อ red_bytes นำคอนสแตนต์ red_message มาแปลงเป็นไบต์เพื่อพร้อมบีบอัด โดยใช้ฟังก์ชัน bytes() และกำหนดฟอร์แมตเป็น 'utf-8' ดังนี้: red_bytes = bytes(red_message, 'utf-8')
สร้างตัวแปรชื่อ red_compression และเก็บค่าที่ได้จาก zlib.compress() โดยใช้ red_bytes เป็นอาร์กิวเมนต์ เพื่อบีบอัดข้อมูล ดังนี้: red_compression = zlib.compress(red_bytes) เมื่อข้อมูลถูกบีบอัดแล้ว ให้ใช้ฟังก์ชัน display() ที่เตรียมไว้ล่วงหน้าในตัวแก้ไขโค้ด แล้วส่งตัวแปร red_message และ red_compression เป็นอาร์กิวเมนต์ เพื่อแสดงข้อความและข้อมูลที่บีบอัด
เดินไปยังเครื่องหมาย X สีอ่อนเหนือพรมสีแดงหันหน้าเข้าหาโต๊ะ แล้วสร้างตัวแปรสองตัวชื่อ message_length และ compression_length ในตัวแปรเหล่านี้เราจะเก็บความยาวตัวอักษรของข้อมูลทั้งก่อนและหลังการบีบอัด โดยใช้ฟังก์ชัน len() ตัวอย่างเช่น สำหรับ message_length ให้รับค่าความยาวของ red_message ดังนี้: message_length = len(red_message) ทำเช่นเดียวกันกับ compression_length โดยเก็บค่า len() ของ red_compression
เมื่อทั้งสองตัวแปรถูกกำหนดค่าแล้ว ให้ใช้ฟังก์ชัน write() ที่เตรียมไว้ และใส่ message_length กับ compression_length เป็นอาร์กิวเมนต์ เพื่อยืนยันขนาดการบีบอัด ซึ่งจะแสดงให้เห็นว่าขนาดไฟล์ลดลงเท่าใดเมื่อเทียบกับยังไม่บีบอัด
เดินไปยังเครื่องหมาย X สีเข้มเหนือพรมสีน้ำเงินหันหน้าเข้าหาคอมพิวเตอร์ สร้างตัวแปรชื่อ blue_bytes แล้วแปลง blue_message เป็นไบต์โดยใช้ฟังก์ชัน bytes() เหมือนกับที่ทำกับ red_message นำคอนสแตนต์ blue_message มาบีบอัดโดยเก็บค่าที่ได้จาก bz2.compress() และส่ง blue_bytes เป็นอาร์กิวเมนต์ ดังนี้: blue_message = bz2.compress(blue_bytes)
สร้างตัวแปรชื่อ blue_decompress แล้วเก็บค่าที่ได้จาก bz2.decompress() โดยส่ง blue_message เป็นอาร์กิวเมนต์ เพื่อดูข้อมูลหลังขยาย (decompression) จากนั้นให้ส่งตัวแปร blue_message กับ blue_decompress ไปยังฟังก์ชัน display() ที่เตรียมไว้ล่วงหน้า เพื่อดูทั้งข้อความที่ถูกบีบอัดและข้อความที่ถูกขยาย
มุ่งหน้าไปยังเครื่องหมาย X สีเข้มเหนือพรมสีเขียว แล้วสร้างออบเจ็กต์ชื่อ compressor โดยกำหนดค่าเป็น lzma.LZMACompressor() ซึ่งจะสร้างออบเจ็กต์คอมเพรสเซอร์ที่ใช้กับฟังก์ชันของ lzma ได้ สร้างตัวแปรชื่อ green_bytes แล้วแปลง green_message เป็นฟอร์แมตไบต์โดยใช้ฟังก์ชัน bytes() เหมือนกับที่ทำกับ red_message และ blue_message
สร้างตัวแปรชื่อ green_compression แล้วเก็บค่าที่ได้จาก compressor.compress() โดยส่ง green_bytes เป็นอาร์กิวเมนต์ ซึ่งจะช่วยให้คุณบีบอัดข้อมูลข้อความโดยใช้คอมเพรสเซอร์ออบเจ็กต์นั้น ในฟังก์ชัน display() ที่เตรียมไว้ ให้ส่งตัวแปร green_message และ green_compression เป็นอาร์กิวเมนต์ เพื่อดูข้อความต้นฉบับและข้อมูลที่ถูกบีบอัด
เดินไปยังเครื่องหมาย X สีอ่อนเหนือพรมสีเขียวหันหน้าเข้าหาโต๊ะ ปรับแก้ตัวแปรสองตัวชื่อ message_length และ compression_length ในตัวแปรเหล่านี้เราจะเก็บความยาวตัวอักษรของข้อมูลทั้งก่อนและหลังการบีบอัด โดยใช้ฟังก์ชัน len() สำหรับ message_length ให้รับค่าความยาวของ green_message ด้วย len() ทำเช่นเดียวกันกับ compression_length โดยเก็บค่า len() ของ green_compression เมื่อทั้งสองตัวแปรถูกกำหนดค่าแล้ว ให้ใช้ฟังก์ชัน write() ที่เตรียมไว้ล่วงหน้าและส่ง message_length กับ compression_length เป็นอาร์กิวเมนต์ เพื่อตรวจสอบขนาดการบีบอัดและจบรอบระดับนี้