Module zipfile cho phép lọc và giải nén file theo điều kiện (extension, tên...).
Ví dụ: Chỉ giải nén file .txt
import zipfile
zip_path = 'my_zip_file.zip'
extract_dir = '.'
with zipfile.ZipFile(zip_path, 'r') as my_zip:
for file_info in my_zip.infolist():
if file_info.filename.endswith('.txt'):
my_zip.extract(file_info, extract_dir)
print(f"Extracted: {file_info.filename}")
Các method hữu ích
ZipFile.namelist()— list tên file.ZipFile.infolist()— listZipInfo(có size, date, compress_type...).extract(member, path)— giải nén 1 file.extractall(path, members=None)— giải nén tất cả hoặc subset.
Bảo mật: Zip Slip vulnerability
Kiểm tra path traversal trước khi extract:
import os
def safe_extract(zip_file, dest_dir):
dest_dir = os.path.abspath(dest_dir)
for member in zip_file.infolist():
member_path = os.path.abspath(os.path.join(dest_dir, member.filename))
if not member_path.startswith(dest_dir):
raise Exception(f"Zip Slip attempt: {member.filename}")
zip_file.extract(member, dest_dir)