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

Hỗ trợ tệp gzip trong Python (module gzip)

GZip là ứng dụng dùng cho nén và giải nén tệp, là một phần của dự án GNU. Module gzip của Python là giao diện cho ứng dụng GZip. Thuật toán nén dữ liệu gzip bản thân dựa trên module zlib.

Module gzip chứa định nghĩa của lớp GzipFile cùng với các phương thức của nó. Nó cũng chứa các hàm tiện ích open(), compress() và decompress().

Cách dễ nhất để thực hiện nén và giải nén là sử dụng các hàm trên.

Hàm open()

Hàm này mở một tệp nén gzip ở chế độ nhị phân hoặc văn bản và trả về một đối tượng giống tệp, có thể là tệp vật lý, chuỗi hoặc đối tượng byte. Mặc định tệp được mở ở chế độ 'rb' (đọc dữ liệu nhị phân), tuy nhiên tham số mode có thể nhận các chế độ sau:

chế độ nhị phân: 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', 'xb'
chế độ văn bản: 'rt', 'at', 'wt', 'xt'

Hàm này cũng định nghĩa mức độ nén với giá trị chấp nhận từ 0 đến 9. Khi tệp mở ở chế độ văn bản, đối tượng GzipFile được bao bọc trong đối tượng TextIOWrapper.

Hàm compress()

Hàm này áp dụng nén lên dữ liệu được truyền làm tham số và trả về đối tượng byte đã nén. Mặc định mức nén là 9.

Hàm decompress()

Hàm này giải nén đối tượng byte và trả về dữ liệu chưa nén.

Ví dụ sau tạo tệp gzip bằng cách ghi dữ liệu nén vào đó:

>>> import gzip
>>> data = b'Python - Batteries included'
>>> with gzip.open("test.txt.gz", "wb") as f:
...     f.write(data)

Thao tác này sẽ tạo tệp test.txt.gz trong thư mục hiện tại. Arşiv gzip này chứa test.txt mà bạn có thể kiểm tra bằng bất kỳ tiện ích giải nén nào.

Để đọc tệp nén này theo chương trình:

>>> with gzip.open("test.txt.gz", "rb") as f:
...     data = f.read()
>>> data
b'Python - Batteries included'

Để nén một tệp hiện có thành arşiv gzip, đọc văn bản trong đó và chuyển đổi thành bytearray. Đối tượng bytearray này sau đó được ghi vào tệp gzip. Trong ví dụ dưới đây, tệp zen.txt được giả định có mặt trong thư mục hiện tại.

>>> fp = open("zen.txt", "rb")
>>> data = fp.read()
>>> bindata = bytearray(data)
>>> with gzip.open("zen.txt.gz", "wb") as f:
...     f.write(bindata)

Để truy xuất tệp chưa nén từ arşiv gzip:

>>> fp = open("zen1.txt", "wb")
>>> with gzip.open("zen.txt.gz", "rb") as f:
...     bindata = f.read()
>>> fp.write(bindata)
>>> fp.close()

Mã trên sẽ tạo zen1.txt trong thư mục hiện tại chứa cùng dữ liệu với zen.txt.

Ngoài các hàm tiện ích này, module gzip cũng có lớp GzipFile định nghĩa các phương thức compress() và decompress(). Constructor của lớp này nhận các tham số file, mode và compresslevel với ý nghĩa giống hệt như trên.

Khi tham số mode là 'w', 'wb' hoặc 'wt', đối tượng GzipFile sẽ cung cấp phương thức write() để nén dữ liệu cho trước và ghi vào tệp gzip.

>>> f = gzip.GzipFile("testnew.txt.gz", "wb")
>>> data = b'Python - Batteries included'
>>> f.write(data)
>>> f.close()

Thao tác này tạo tệp testnew.txt.gz. Bạn có thể giải nén nó bằng bất kỳ tiện ích nào để thấy nó chứa testnew.txt với văn bản 'Python – Batteries included'.

Để giải nén tệp gzip sử dụng đối tượng GzipFile, tạo nó với giá trị 'rb' cho tham số mode và đọc dữ liệu chưa nén bằng phương thức read():

>>> f = gzip.GzipFile("testnew.txt.gz", "rb")
>>> data = f.read()
>>> data
b'Python - Batteries included'

Trong bài viết này chúng ta đã học cách thư viện gzip có thể được triển khai bằng module gzip của Python.