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

Làm việc với các kho lưu trữ ZIP bằng Python (zipfile)

ZIP là một trong những định dạng tệp phổ biến nhất được sử dụng để lưu trữ và nén. Nó đã được sử dụng từ thời MSDOS và PC và đã được ứng dụng PKZIP nổi tiếng sử dụng.

Mô-đun zipfile trong thư viện chuẩn của Python cung cấp các lớp hỗ trợ các công cụ tạo, giải nén, đọc và ghi vào các kho lưu trữ ZIP.

ZipFile ()

Hàm này trả về một đối tượng ZipFile từ một tham số tệp có thể là một chuỗi hoặc đối tượng tệp như được tạo bởi hàm open () tích hợp sẵn. Hàm cần một tham số chế độ có giá trị mặc định là ‘r’ mặc dù nó có thể nhận giá trị ‘w’ hoặc ‘a’ để mở tệp lưu trữ ở chế độ đọc, ghi hoặc nối tương ứng.

Kho lưu trữ theo mặc định là không nén. Để chỉ định loại thuật toán nén sẽ được sử dụng, một trong các hằng số phải được gán cho tham số nén.

zipfile.ZIP_STORED cho một thành viên lưu trữ không nén.
zipfile.ZIP_DEFLATED cho phương pháp nén ZIP thông thường. Điều này yêu cầu mô-đun zlib.
zipfile.ZIP_BZIP2 cho phương pháp nén BZIP2. Điều này yêu cầu mô-đun bz2.
zipfile.ZIP_LZMA cho phương pháp nén LZMA. Điều này yêu cầu mô-đun lzma.

Đối tượng ZipFile sử dụng các mehods sau.

write ()

Phương thức này đã cung cấp tệp cho tệp lưu trữ được đại diện bởi đối tượng ZipFile.

>>> import zipfile
>>> newzip=zipfile.ZipFile('newdir/newzip.zip','w')
>>> newzip.write('zen.txt')
>>> newzip.close()

Có thể thêm tệp bổ sung vào kho lưu trữ hiện có bằng cách mở tệp đó ở chế độ nối thêm (‘a’ làm chế độ)

>>> newzip=zipfile.ZipFile('newdir/newzip.zip','a')
>>> newzip.write('zen.txt')
>>> newzip.close()

read ()

Phương pháp này đọc dữ liệu từ một tệp 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 pháp này liệt kê tất cả các tệp trong kho lưu trữ nhất định.

>>> newzip.printdir()
File Name Modified Size
json.txt 2018-11-2717:04:40 35
zen.txt 2018-11-2523:13:44 878

extract ()

Phương thức này sẽ trích xuất một tệp được chỉ định từ kho lưu trữ theo mặc định vào thư mục hiện tại hoặc một tệp được cung cấp làm tham số thứ hai cho nó.

>>> newzip.extract('json.txt','newdir')
'newdir\\json.txt'

extractall ()

Phương pháp này trích xuất tất cả các tệp trong kho lưu trữ vào thư mục hiện tại theo mặc định. Chỉ định thư mục thay thế nếu được yêu cầu 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 tệp đã cho. Đối tượng ZipInfo chứa thông tin siêu dữ liệu khác nhau của tệp.

Đoạn mã sau lấy đối tượng ZipInfo của ‘zen.txt’ từ kho lưu trữ và truy xuất tên tệp, kích thước và thông tin ngày-giờ từ đó.

>>> 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ả tệp 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ư đã đề cập trước đó, thuật toán nén được áp dụng trong khi xây dựng kho lưu trữ ZIP được chỉ định trong tham số nén. Trong mã sau, hằng số ZIP-DEFLATED xây dựng kho lưu trữ bằng cách sử 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ả các tệp 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 giải nén 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ể tạo một mô-đun chứa các tệp có phần mở rộng .py. Có thể thêm tệp lưu trữ này trong biến môi trường sys.path để có thể nhập mô-đun bằng mô-đun zipimport.

Phương thức writepy () thêm tệp .py vào kho lưu trữ sau khi biên dịch nó trong tệp .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à chức năng trong mô-đun zipfile đã được thảo luận.