Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Hỗ trợ nén bzip2 trong Python (module bz2)

bzip2 là một thuật toán mã nguồn mở dùng để nén và giải nén tệp. Module bz2 của Python cung cấp chức năng triển khai thuật toán bzip2 theo cách lập trình.

Hàm open()

Hàm này mở một tệp nén bzip2 và trả về một đối tượng tệp. Tệp có thể được mở ở chế độ nhị phân/văn bản với quyền đọc/ghi. Hàm thực hiện nén dựa trên tham số compresslevel từ 1 đến 9.

Phương thức write()

Khi tệp được mở ở chế độ 'w' hoặc 'wb', phương thức này có sẵn cho đối tượng tệp. Ở chế độ nhị phân, nó ghi dữ liệu nhị phân đã nén vào tệp. Ở chế độ văn bản thông thường, đối tượng tệp được bao bọc trong đối tượng TextIOWrapper để thực hiện mã hóa.

read() − Khi mở ở chế độ đọc, hàm này đọc và trả về dữ liệu chưa nén.

Đoạn mã sau ghi dữ liệu nén vào tệp bzip2:

>>> import bz2
>>> f = bz2.open("test.bz2", "wb")
>>> data = b'Welcome to TutorialsPoint'
>>> f.write(data)
>>> f.close()

Thao tác này sẽ tạo tệp test.bz2 trong thư mục hiện tại. Mọi công cụ giải nén sẽ hiển thị một tệp test bên trong. Để đọc dữ liệu chưa nén từ tệp test.bz2 này, sử dụng mã sau:

>>> f = bz2.open("test.bz2", "rb")
>>> data = f.read()
>>> data
b'Welcome to TutorialsPoint'

Module bz2 cũng định nghĩa lớp BZ2File. Đối tượng của lớp này đóng vai trò như một bộ nén và giải nén tùy thuộc vào tham số mode truyền cho constructor.

BZ2File()

Đây là constructor. Giống như hàm open(), các tham số file và mode là bắt buộc. compresslevel mặc định là 9 và có thể từ 1 đến 9.

BZ2Compressor()

Hàm này trả về đối tượng của lớp bộ nén gia tăng (Incremental compressor). Mỗi lần gọi phương thức compress() trong lớp này trả về một khối dữ liệu nén. Nhiều khối có thể được nối lại với nhau và cuối cùng ghi vào tệp nén bzip2.

Phương thức flush()

Phương thức này làm rỗng bộ đệm và trả về khối dữ liệu trong đó để nối thêm vào đối tượng nén.

BZ2Decompressor()

Hàm này trả về đối tượng bộ giải nén gia tăng. Các khối dữ liệu giải nén riêng lẻ được nối lại với dữ liệu đã flush để tạo thành dữ liệu chưa nén.

Ví dụ sau nén từng mục trong đối tượng danh sách và ghi đối tượng byte nối lại vào tệp. Dữ liệu được truy xuất bằng đối tượng BZ2Decompressor.

>>> import bz2
>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = bz2.BZ2Compressor()
>>> f = bz2.open("test.bz2", "wb")
>>> d1 = obj.compress(data[0])
>>> d2 = obj.compress(data[1])
>>> d3 = obj.compress(data[2])
>>> d4 = obj.flush()
>>> compressedobj = d1 + d2 + d3 + d4
>>> f.write(compressedobj)
>>> f.close()
>>> obj = bz2.BZ2Decompressor()
>>> f = bz2.open("test.bz2", "rb")
>>> data = f.read()
>>> obj.decompress(data)
b'Hello WorldHow are you?welcome to Python'