zipfile để nén và giải nén các tệp ZIP bằng Python

Kinh doanh

Mô-đun zipfile của thư viện chuẩn Python có thể được sử dụng để nén tệp thành ZIP và giải nén tệp ZIP. Nó được bao gồm trong thư viện tiêu chuẩn, vì vậy không cần cài đặt thêm.

Nội dung sau đây được giải thích.

  • Nén nhiều tệp thành một tệp ZIP
  • Thêm tệp mới vào tệp ZIP hiện có
  • Nén thư mục (thư mục) thành tệp ZIP
  • Được nén thành tệp ZIP có mật khẩu
  • Kiểm tra nội dung của tệp ZIP.
  • Giải nén (giải nén) toàn bộ nội dung của tệp ZIP.
  • Chọn nội dung của tệp ZIP và giải nén nó.

Nén nhiều tệp thành một tệp ZIP

Tạo một đối tượng ZipFile và sử dụng phương thức write () để thêm các tệp bạn muốn nén.

Để tạo tệp ZIP mới, hãy chỉ định đường dẫn của tệp ZIP sẽ được tạo làm đối số đầu tiên của hàm tạo của đối tượng ZipFile và đối số thứ hai như sauw'

Ngoài ra, phương thức nén có thể được chỉ định làm đối số thứ ba.

  • zipfile.ZIP_STORED:Chỉ cần kết hợp nhiều tệp mà không cần nén (mặc định)
  • zipfile.ZIP_DEFLATED:Nén ZIP bình thường (yêu cầu mô-đun zlib)
  • zipfile.ZIP_BZIP2:Nén BZIP2 (yêu cầu mô-đun bz2)
  • zipfile.ZIP_LZMA:Nén LZMA (yêu cầu mô-đun lzma)

BZIP2 và LZMA có tỷ lệ nén cao hơn (có thể nén ở kích thước nhỏ hơn), nhưng thời gian nén cần lâu hơn.

Trong phương thức write (), tệp có tên tệp đối số đầu tiên được ghi vào tệp ZIP có tên tệp đối số thứ hai. Nếu tên cung bị bỏ qua, tên tệp được sử dụng như hiện tại. arcname cũng có thể chỉ định cấu trúc thư mục.

Đối tượng ZipFile cần được đóng bằng phương thức close (), nhưng nếu bạn sử dụng câu lệnh with, nó sẽ tự động bị đóng khi khối kết thúc.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Bằng cách chỉ định đối số kiểu nén của phương thức write (), cũng có thể chọn phương thức nén cho mỗi tệp.

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Thêm tệp mới vào tệp ZIP hiện có

Để thêm tệp mới vào tệp zip hiện có, hãy đặt đối số đầu tiên của hàm tạo thành đường dẫn của tệp zip hiện có khi tạo đối tượng ZipFile. Ngoài ra, hãy đặt chế độ đối số thứ hai như sau.a'

Sau đó, như trong ví dụ trên, chỉ cần thêm tệp bằng phương thức write ().

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

Nén thư mục (thư mục) thành tệp ZIP

Nếu bạn muốn nén toàn bộ thư mục (thư mục) thành một tệp ZIP, bạn có thể sử dụng os.scandir () hoặc os.listdir () để tạo danh sách các tệp, nhưng sử dụng make_archive () trong Shutil sẽ dễ dàng hơn. mô-đun.

Xem bài viết sau.

Được nén thành tệp ZIP có mật khẩu

Mô-đun tệp zip không cho phép bạn tạo tệp ZIP được bảo vệ bằng mật khẩu. Nếu bạn muốn nén tệp thành tệp zip được bảo vệ bằng mật khẩu, hãy sử dụng thư viện bên thứ ba pyminizip.

Lưu ý rằng việc giải nén các ZIP được bảo vệ bằng mật khẩu có thể được thực hiện với mô-đun zipfile (xem bên dưới).

Kiểm tra nội dung của tệp ZIP.

Bạn có thể kiểm tra nội dung của tệp ZIP hiện có.

Tạo một đối tượng ZipFile bằng cách đặt tệp đối số đầu tiên trong hàm tạo thành đường dẫn của tệp zip hiện có và chế độ đối số thứ hai thành ‘r’. Đối số mode có thể bị bỏ qua vì giá trị mặc định là ‘r’.

Bạn có thể sử dụng phương thức namelist () của đối tượng ZipFile để lấy danh sách các tệp đã lưu trữ.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

Giải nén (giải nén) toàn bộ nội dung của tệp ZIP.

Để giải nén nội dung của tệp ZIP, hãy tạo một đối tượng ZipFile với tệp đối số đầu tiên trong hàm tạo làm đường dẫn đến tệp ZIP hiện có và chế độ đối số thứ hai là ‘r’, như trong ví dụ trên. Đối số mode có thể bị bỏ qua vì nó được mặc định là ‘r’.

Phương thức extractall () của đối tượng ZipFile trích xuất (giải nén) toàn bộ nội dung của tệp ZIP. Đối số đầu tiên, đường dẫn, chỉ định đường dẫn của thư mục để giải nén. Nếu nó bị bỏ qua, các tệp sẽ được trích xuất vào thư mục hiện tại.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

Tệp ZIP có mật khẩu có thể được trích xuất bằng cách chỉ định mật khẩu làm đối số pwd của phương thức extractall ().

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

Chọn nội dung của tệp ZIP và giải nén nó.

Nếu bạn chỉ muốn giải nén và giải nén một số tệp nhất định, hãy sử dụng phương thức extract ().

Đối số đầu tiên của phương thức extract () là tên của tệp cần giải nén và đường dẫn đối số thứ hai là đường dẫn của thư mục cần giải nén. Nếu đối số đường dẫn bị bỏ qua, tệp sẽ được trích xuất vào thư mục hiện tại. Tên của tệp được giải nén phải bao gồm đường dẫn đến thư mục trong tệp ZIP nếu nó được lưu trữ ở đó.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

Giống như phương thức extractall (), phương thức extract () cũng cho phép bạn chỉ định mật khẩu làm đối số pwd.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')
Copied title and URL