Khóa học Phát triển Python Nâng cao
Chương
>
Cấp độ
Các mô-đun tuần tự hóa
Mô-đun nén
Mục tiêu
Lấy tin nhắn và đơn đặt hàng và nén chúng để lưu trữ và truyền tải.
Có một số hướng dẫn thi công, lô hàng và bản kê hàng đã được gửi đi và cần được chuyển tiếp hoặc lưu trữ. Mặc dù bạn có thể gửi thủ công tất cả, một cách hiệu quả là nén và giải nén các tệp rồi lưu trữ hoặc gửi chúng. Để làm điều này, bạn có thể sử dụng các module nén để giảm kích thước tệp và giúp việc quản lý thông tin trở nên dễ dàng hơn. Khác với những bài đã giải quyết trước đây khi chỉ dùng một module duy nhất, ở đây chúng ta có thể sử dụng nhiều module nén với một số chức năng cơ bản. Chúng gồm:
Để có tốc độ nén nhanh và mức nén thấp, sử dụng module zlib bằng cách thêm import zlib. Ở đây chúng ta sẽ sử dụng hàm zlib.compress(), với một đối số là dữ liệu bạn muốn nén. Đối số cần được nhập dưới dạng bytes thay vì chuỗi.
Để có tốc độ nén trung bình và mức nén trung bình, sử dụng module bz2 bằng cách thêm import bz2. Ở đây chúng ta sẽ sử dụng các hàm sau:
bz2.compress(), với một đối số là dữ liệu bạn muốn nén.bz2.decompress(), với một đối số là dữ liệu bạn muốn nén. Đối số cần được nhập dưới dạng bytes thay vì chuỗi.
Đối số cần được nhập dưới dạng bytes thay vì chuỗi.
Để có mức nén cao nhưng tốc độ nén chậm, sử dụng module lzma bằng cách thêm import lzma. Ở đây chúng ta sẽ sử dụng các lớp và hàm sau:
lzma.LZMACompressor(): Lớp dùng để tạo đối tượng nén cho phép bạn kích hoạt bộ nén.compress(): sử dụng một đối số là dữ liệu bạn muốn nén. Nó cần được nhập dưới dạng bytes thay vì chuỗi.
Ngoài các module trên, chúng ta sẽ sử dụng hàm bytes() để chuyển đổi chuỗi thành bytes, điều này sẽ rất hữu ích cho việc nén. Hàm này nhận hai đối số: chuỗi cần chuyển và định dạng, ở đây là 'utf-8'.
Có ba hằng số chứa dữ liệu cần nén, lần lượt tên là red_message, blue_message và green_message. Để bắt đầu, đi đến dấu X vàng trên thảm đỏ, tạo một biến tên là red_bytes. Lấy hằng số red_message và chuyển đổi thông điệp thành bytes để có thể nén, bằng cách sử dụng hàm bytes() với định dạng 'utf-8', như sau: red_bytes = bytes(red_message, 'utf-8').
Tạo một biến tên là red_compression và gán giá trị của zlib.compress() cho nó, sử dụng red_bytes làm đối số để nén dữ liệu, như sau: red_compression = zlib.compress(red_bytes). Sau khi dữ liệu đã được nén, hãy sử dụng hàm đã viết sẵn display() trong trình soạn thảo mã và thêm các biến red_message và red_compression làm đối số để đọc thông điệp và xem dữ liệu nén.
Đi đến dấu X sáng trên thảm đỏ và quay mặt vào bàn làm việc, tạo hai biến tên là message_length và compression_length. Trong các biến này, chúng ta sẽ lưu độ dài ký tự của dữ liệu trước và sau khi nén bằng hàm len(). Ví dụ, với message_length, lấy độ dài của red_message, như sau: message_length = len(red_message). Tương tự, với compression_length, lưu độ dài của red_compression bằng len().
Khi cả hai biến đã được gán giá trị, hãy sử dụng hàm đã viết sẵn write() và chèn message_length và compression_length làm đối số để xác minh kích thước nén. Điều này cho thấy mức độ nén của tệp so với khi chưa nén.
Đi đến dấu X tối trên thảm xanh dương và quay mặt vào máy tính. Tạo một biến tên là blue_bytes và chuyển blue_message thành bytes bằng hàm bytes() tương tự như với red_message. Sau đó nén hằng số blue_message bằng cách gán giá trị của bz2.compress() cho nó và đưa blue_bytes làm đối số, như sau: blue_message = bz2.compress(blue_bytes).
Tạo một biến tên là blue_decompress và gán giá trị của bz2.decompress() cho nó, thêm blue_message làm đối số để xem dữ liệu sau khi giải nén. Thêm các biến blue_message và blue _decompress vào hàm đã viết sẵn display() để xem các biến thể nén và giải nén của dữ liệu tin nhắn.
Tiếp tục đến dấu X tối trên thảm xanh lá, tạo một đối tượng tên là compressor và gán lzma.LZMACompressor() cho nó, điều này sẽ tạo một đối tượng nén có thể sử dụng với các hàm của lzma. Tạo một biến tên là green_bytes và chuyển green_message thành bytes bằng hàm bytes() tương tự như với red_message và blue message.
Tạo một biến tên là green_compression và gán giá trị của compressor.compress() cho nó, thêm green_bytes làm đối số. Điều này cho phép bạn nén dữ liệu tin nhắn bằng đối tượng nén. Trong hàm đã viết sẵn display(), thêm các biến green_message và green_compression làm đối số để xem thông điệp và dữ liệu nén.
Đi đến dấu X sáng trên thảm xanh lá và quay mặt vào bàn làm việc, chỉnh sửa hai biến tên là message_length và compression_length. Trong các biến này, chúng ta sẽ lưu độ dài ký tự của dữ liệu trước và sau khi nén bằng hàm len(). Với message_length, lấy độ dài của green_message bằng len(). Tương tự, với compression_length, lưu độ dài của green_compression bằng len(). Khi cả hai biến đã được gán giá trị, hãy sử dụng hàm đã viết sẵn write() và chèn message_length và compression_length làm đối số để xác minh kích thước nén và hoàn thành cấp độ.