python--文件夹的压缩和解压缩(zipfile/pyzipper)
压缩
import os
import zipfile
from loguru import logger
def zip_directory(directory, zip_file_path, password):
'''
压缩
@params directory --> 要压缩的目标文件夹路径;
@params zip_file_path --> 压缩后的文件名;
@params password --> 密码;
zipfile.ZIP_STORED:不进行压缩,只是将文件存储在 ZIP 文件中。
zipfile.ZIP_DEFLATED:使用 DEFLATE 算法进行压缩,这是默认的压缩算法,压缩率较高。
zipfile.ZIP_BZIP2:使用 BZIP2 算法进行压缩,压缩率通常比 DEFLATE 更高,但压缩和解压缩速度较慢。
zipfile.ZIP_LZMA:使用 LZMA 算法进行压缩,压缩率也很高,并且在某些情况下性能优于 BZIP2。
'''
with zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
# zipf.setpassword(password.encode()) # zipfile压缩时设置密码不生效 需要更换模块
for root, dirs, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, directory) # 相对路径
logger.debug(f'正在压缩:{file_path}-->{arcname}')
zipf.write(file_path, arcname)
directory_to_zip = r'C:\Users\123\Desktop\train'
zip_file = r'C:\Users\123\Desktop\5656\directory.zip'
password = 'zhimakaimen'
zip_directory(directory_to_zip, zip_file, password)
解压缩
解压缩全部
import zipfile
def unzip_file(zip_file_path, extract_path):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
zip_ref.setpassword('zhimakaimen'.encode())
zip_ref.extractall(extract_path)
print(f"成功将 {zip_file_path} 解压缩到 {extract_path}")
# 请替换为实际的 ZIP 文件路径
zip_file = r'C:\Users\123\Desktop\5656\train.zip'
# 请替换为实际要解压缩到的目录
extract_dir = r'C:\Users\123\Desktop\5656\123'
unzip_file(zip_file, extract_dir)
逐个文件解压缩
def unzip_with_password(zip_file_path, extract_path, password):
try:
with zipfile.ZipFile(zip_file_path, 'r') as zipf:
zipf.setpassword(password.encode())
# 获取 ZIP 文件中的所有文件信息
file_list = zipf.namelist()
total_files = len(file_list)
print(f"开始解压缩,共有 {total_files} 个文件需要解压缩。")
for index, file in enumerate(file_list, start=1):
# 提取单个文件
zipf.extract(file, extract_path)
print(f"已解压缩文件 {index}/{total_files}: {file}")
print("解压缩成功!")
except Exception as e:
print(f"解压缩失败: {e}")
unzip_with_password(r'C:\Users\123\Desktop\5656\directory.zip', r'C:\Users\123\Desktop\5656\123', 'zhimakaimen')
pyzipper 第三方模块
import pyzipper
import os
def compress_files(files, zip_file_path, password):
"""
压缩文件到带密码的 ZIP 文件
:param files: 要压缩的文件列表
:param zip_file_path: 压缩后的 ZIP 文件路径
:param password: 压缩密码
"""
with pyzipper.AESZipFile(zip_file_path, 'w',
compression=pyzipper.ZIP_DEFLATED,
encryption=pyzipper.WZ_AES) as zipf:
zipf.setpassword(password.encode())
for file in files:
if os.path.isfile(file):
arcname = os.path.basename(file)
zipf.write(file, arcname)
else:
print(f"{file} 不是有效的文件,跳过。")
def decompress_file(zip_file_path, extract_path, password):
"""
解压缩带密码的 ZIP 文件
:param zip_file_path: 要解压缩的 ZIP 文件路径
:param extract_path: 解压缩的目标路径
:param password: 压缩密码
"""
try:
with pyzipper.AESZipFile(zip_file_path, 'r') as zipf:
zipf.setpassword(password.encode())
file_list = zipf.namelist()
total_files = len(file_list)
print(f"开始解压缩,共有 {total_files} 个文件需要解压缩。")
for index, file in enumerate(file_list, start=1):
zipf.extract(file, extract_path)
print(f"已解压缩文件 {index}/{total_files}: {file}")
print("解压缩成功!")
except Exception as e:
print(f"解压缩失败: {e}")
# 示例使用
files_to_compress = ['file1.txt', 'file2.txt']
zip_file = 'encrypted.zip'
password = 'your_password'
extract_path = '.'
# 压缩文件
compress_files(files_to_compress, zip_file, password)
# 解压缩文件
decompress_file(zip_file, extract_path, password)