解压文件
import zipfile
def unzip_zips(input_zip_file_path, out_path):
"""
解压zip文件,到 out_path 目录
:param input_zip_file_path: 如 D:\abc\efg.zip
:param out_path: 解压到这个目录
"""
if zipfile.is_zipfile(input_zip_file_path):
max_size = 1 * 1024 * 1024 * 500
file_size = 0
fz = zipfile.ZipFile(input_zip_file_path, "r")
for file in fz.infolist():
# 定义最大解压文件大小,防止解压炸弹,限制500兆大小
file_size += file.file_size
if file_size >= max_size:
break
fz.extract(file.filename, out_path)
fz.close()
else:
raise Exception("文件不是压缩文件,请检查!")
压缩文件
import os
import zipfile
def zip_func(out_out_zip_name: str, input_zip_file_path: str):
"""压缩文件目录下面的文件"""
file_list = []
# 获取需要压缩的,文件夹下面全部文件
for path_dir, dir_names, file_names in os.walk(input_zip_file_path):
for filename in file_names:
file_abs_path = os.path.join(path_dir, filename)
file_list.append(file_abs_path)
# 切换到压缩目录
os.chdir(input_zip_file_path)
# 开始压缩
with zipfile.ZipFile(out_out_zip_name, "w") as zip_obj:
for file in file_list:
file = file[len(out_out_zip_name) + 1::]
zip_obj.write(file)
def zip_func_two(out_out_zip_name: str, input_zip_file_path: str):
"""压缩文件目录下面的文件"""
fz = zipfile.ZipFile(out_out_zip_name, "w", compression=zipfile.ZIP_DEFLATED)
for path_dir, dir_names, file_names in os.walk(input_zip_file_path):
for filename in file_names:
file_abs_path = os.path.join(path_dir, filename)
fz.write(file_abs_path, file_abs_path.replace(input_zip_file_path, "", 1))
# 空文件也需要压缩
if not file_names and not dir_names:
zip_info = zipfile.ZipInfo(path_dir.replace(input_zip_file_path, "", 1).replace(os.path.sep, "", 1) + "/")
fz.writestr(zip_info, "")
fz.close()
return out_out_zip_name