Computer >> Máy Tính >  >> Lập trình >> Python

Nén bằng thuật toán LZMA bằng Python (lzma)

Thuật toán chuỗi Lempel – Ziv – Markov (LZMA) thực hiện nén dữ liệu không mất dữ liệu bằng cách sử dụng sơ đồ nén từ điển có tỷ lệ nén cao hơn các thuật toán nén khác. Mô-đun lzma của Python bao gồm các lớp và các hàm tiện lợi để nén và giải nén dữ liệu bằng thuật toán LZMA.

Mặc dù chức năng trong mô-đun này tương tự như chức năng của mô-đun bz2, lớp LZMAFile không an toàn cho luồng so với lớp BZ2File.

Ở đây, hàm open () trong mô-đun lzma là cách dễ nhất để mở đối tượng tệp nén lzma.

open ()

Hàm này mở một tệp nén LZMA và trả về một đối tượng tệp. Hàm yêu cầu hai tham số chính - tên tệp và chế độ. Tham số chế độ theo mặc định là “rb” nhưng có thể nhận bất kỳ giá trị nào sau đây

Chế độ nhị phân
binary mode - "r", "rb", "w", "wb", "x", "xb", "a" or "ab"
text mode - "rt", "wt", "xt", or "at"

nén ()

Hàm này nén dữ liệu đã cho bằng thuật toán LZMA và trả về một đối tượng byte. Hàm này có thể tùy chọn tồn tại một đối số định dạng quyết định định dạng vùng chứa. Các giá trị có thể có là FORMAT_XZ (mặc định) và FORMAT_ALONE.

giải nén ()

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

Các hàm trên được sử dụng trong các ví dụ sau. Để ghi dữ liệu nén LZMA vào tệp

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

Tệp ‘test.xz’ sẽ được tạo trong thư mục làm việc hiện tại. Để tìm nạp dữ liệu không nén từ tệp này, hãy sử dụng mã sau.

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

Để thực hiện nén bằng cách sử dụng API hướng đối tượng của mô-đun lzma, chúng ta phải sử dụng lớp LZMAFile

LZMAFile ()

Đây là hàm tạo cho lớp LZMAFile. Nó yêu cầu tệp và chế độ được chỉ định. Đối tượng có chế độ ‘w’ hoặc ‘wb’ cung cấp phương thức write () cho nó.

write ()

Phương pháp này nén dữ liệu đã cho và ghi dữ liệu đó vào tệp bên dưới nó.

>>> data = b'Welcome to TutorialsPoint'
>>>obj = lzma.LZMAFile("test.xz", mode="wb")
>>>obj.write(data)
>>>obj.close()

Tệp nén được đọc và dữ liệu không nén được truy xuất bằng phương thức read () của đối tượng LZMAFile được tạo với tham số mode =’rb’.

read ()

Phương thức này đọc dữ liệu từ tệp nén và trả về dữ liệu không được nén.

>>>obj = lzma.LZMAFile("test.xz", mode="rb")
>>> data=obj.read()
>>> data
b'Welcome to TutorialsPoint'

Thuật toán LZMA cũng cho phép ghi dữ liệu nén vào một tệp đã mở. Trong ví dụ sau, ‘test.txt’ được mở bình thường (sử dụng hàm open () tích hợp sẵn) ở chế độ ‘wb’ và một số văn bản được ghi vào đó. Sau đó, cùng một tệp được sử dụng để ghi dữ liệu nén.

>>> f = open("test.txt","wb")
>>>f.write(b"Hello world")
>>>fp = lzma.open(f,"wb")
>>>fp.write(b"Welcome to Python")
>>>f.write(b"Thank you")
>>>f.close()
>>>fp.flush()
>>>fp.close()

Khi đoạn mã trên được thực thi, ‘test.txt’ sẽ xuất hiện trong thư mục hiện tại. Nó chứa hỗn hợp dữ liệu nén và không nén như bên dưới

Hello worldý7zXZ æÖ´F!t/å£Thank you

Giống như trong mô-đun bz2, mô-đun lzma cũng có các lớp bộ nén và giải nén tăng dần.

LZMACompressor ()

Đây là một hàm tạo trả về đối tượng máy nén tăng dần. Nhiều phần có thể được nén riêng lẻ và dữ liệu nối của chúng được ghi vào tệp

nén ()

Phương thức này nén dữ liệu đã cho và trả về đối tượng byte

flush ()

Phương thức này làm trống bộ đệm và trả về một đối tượng byte.

Ví dụ sau nén một đối tượng danh sách bằng cách sử dụng đối tượng nén tăng dần.

>>> data = [b'Hello World', b'How are you?', b'welcome to Python']
>>> obj = lzma.LZMACompressor()
>>> bindata = []
>>> for i in data:
bindata.append(obj.compress(i))
>>> bindata.append(obj.flush())
>>> bindata
[b'\xfd7zXZ\x00\x00\x04\xe6\xd6\xb4F\x02\x00!\x01\x16\x00\x00\x00t/\xe5\xa3', b'', b'', b"\x01\x00'Hello WorldHow are you?welcome to Python\x00\xf5\xc6\xc1d|\xf3\x8ey\x00\x01@(\xd4RJ\xe5\x1f\xb6\xf3}\x01\x00\x00\x00\x00\x04YZ"]

Đoạn mã trên xây dựng dữ liệu liên kết dưới dạng danh sách các biểu diễn byte nén của từng mục trong danh sách gốc. Để truy xuất dữ liệu chưa được nén bằng LZMADecompressor đối tượng, sử dụng câu lệnh sau

>>> obj = lzma.LZMADecompressor()
>>> binstr = b''.join(bindata)
>>> obj.decompress(binstr)
b'Hello WorldHow are you?welcome to Python'

Trong bài viết này, các lớp và hàm trong mô-đun lzma đã được giải thích với các ví dụ.