ZIP là một trong những định dạng file phổ biến nhất dùng để lưu trữ và nén. Nó đã được dùng từ thời MSDOS và PC và đã được ứng dụng nổi tiếng PKZIP sử dụng.
Mô-đun zipfile trong thư viện chuẩn Python cung cấp các lớp tạo điều kiện cho các công cụ tạo, trích xuất, đọc và ghi vào kho lưu trữ ZIP.
ZipFile()
Hàm này trả về đối tượng ZipFile từ tham số file có thể là chuỗi hoặc đối tượng file được tạo bởi hàm tích hợp sẵn open(). Hàm cần tham số mode có giá trị mặc định là 'r' mặc dù nó có thể nhận giá trị 'w' hoặc 'a' để mở kho lưu trữ ở chế độ đọc, ghi hoặc nối tương ứng.
Kho lưu trữ mặc định không nén. Để chỉ định loại thuật toán nén được dùng, một trong các hằng số sau phải được gán cho tham số compression.
| zipfile.ZIP_STORED | cho thành viên kho lưu trữ không nén. |
| zipfile.ZIP_DEFLATED | cho phương pháp nén ZIP thông thường. Yêu cầu mô-đun zlib. |
| zipfile.ZIP_BZIP2 | cho phương pháp nén BZIP2. Yêu cầu mô-đun bz2. |
| zipfile.ZIP_LZMA | cho phương pháp nén LZMA. Yêu cầu mô-đun lzma. |
Đối tượng ZipFile sử dụng các phương thức sau:
write()
Phương thức này thêm file cho kho lưu trữ được biểu diễn bởi đối tượng ZipFile.
>>> import zipfile
>>> newzip = zipfile.ZipFile('newdir/newzip.zip', 'w')
>>> newzip.write('zen.txt')
>>> newzip.close()File bổ sung có thể được thêm vào kho lưu trữ đã tồn tại bằng cách mở nó ở chế độ nối ('a' làm mode).
>>> newzip = zipfile.ZipFile('newdir/newzip.zip', 'a')
>>> newzip.write('zen.txt')
>>> newzip.close()read()
Phương thức này đọc dữ liệu từ một file cụ thể trong kho lưu trữ.
>>> newzip = zipfile.ZipFile('newdir/newzip.zip', 'r')
>>> data = newzip.read('json.txt')
>>> data
b'["Rakesh", {"marks": [50, 60, 70]}]'printdir()
Phương thức này liệt kê tất cả file trong kho lưu trữ cho trước.
>>> newzip.printdir() File Name Modified Size json.txt 2018-11-27 17:04:40 35 zen.txt 2018-11-25 23:13:44 878
extract()
Phương thức này trích xuất một file được chỉ định từ kho lưu trữ mặc định đến thư mục hiện tại hoặc đến thư mục được cho làm tham số thứ hai.
>>> newzip.extract('json.txt', 'newdir')
'newdir\\json.txt'extractall()
Phương thức này trích xuất tất cả file trong kho lưu trữ đến thư mục hiện tại mặc định. Chỉ định thư mục thay thế nếu cần làm tham số.
>>> newzip.extractall('newdir')getinfo()
Phương thức này trả về đối tượng ZipInfo tương ứng với file cho trước. Đối tượng ZipInfo chứa các thông tin metadata khác nhau của file.
Mã sau lấy đối tượng ZipInfo của zen.txt từ kho lưu trữ và truy xuất tên file, kích thước và thông tin ngày-giờ từ nó.
>>> inf = newzip.getinfo('zen.txt')
>>> inf.filename, inf.file_size, inf.date_time
('zen.txt', 878, (2018, 11, 25, 23, 13, 45))infolist()
Phương thức này trả về danh sách các đối tượng ZipInfo của tất cả file trong kho lưu trữ.
>>> newzip.infolist() [<ZipInfo filename='json.txt' filemode='-rw-rw-rw-' file_size=35>, <ZipInfo filename='zen.txt' filemode='-rw-rw-rw-' file_size=878>]
Như đã nhắc trước, thuật toán nén được áp dụng khi xây dựng kho lưu trữ ZIP được chỉ định trong tham số compression. Trong mã sau, hằng số ZIP_DEFLATED xây dựng kho lưu trữ dùng nén zlib.
>>> zipobj = zipfile.ZipFile('txtzip.zip', mode='w', compression=zipfile.ZIP_DEFLATED)
>>> files = glob.glob("*.txt")
>>> for file in files:
... zipobj.write(file)
>>> zipobj.close()namelist()
Phương thức này của đối tượng ZipFile trả về danh sách tất cả file trong kho lưu trữ.
>>> zipobj = zipfile.ZipFile('txtzip.zip', mode='r')
>>> zipobj.namelist()
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt/', 'zen.txt', 'zen1.txt', 'zenbak.txt']setpassword()
Phương thức này đặt tham số mật khẩu phải được cung cấp tại thời điểm trích xuất kho lưu trữ.
PyZipFile()
Hàm này trong mô-đun zipfile trả về đối tượng PyZipFile. Đối tượng PyZipFile có thể xây dựng một mô-đun chứa các file với phần mở rộng .py. Kho lưu trữ này có thể được thêm vào biến môi trường sys.path để mô-đun có thể được nhập bằng mô-đun zipimport.
Phương thức writepy() thêm file .py vào kho lưu trữ sau khi biên dịch nó thành file .pyc tương ứng.
files = glob.glob("*.py")
>>> pyzipobj = zipfile.PyZipFile('pyfiles/pyzip.zip', mode='w', compression=zipfile.ZIP_LZMA)
>>> for file in files:
... pyzipobj.writepy(file)
>>> pyzipobj.close()Trong bài viết này, các lớp và hàm trong mô-đun zipfile đã được thảo luận.