1、自定义公共函数zip_files_and_dirs
import os
import zipfile
# 被压缩的目录,即使为空文件也要一起进行压缩,如果不为空则它的子级文件或目录也一起压缩,并且解压保持目录结构不变
def zip_files_and_dirs(file_path_list, target_dir, target_file_name):
# 确保目标目录存在
if not os.path.exists(target_dir):
os.makedirs(target_dir)
# 创建zip文件的完整路径
zip_path = os.path.join(target_dir, f"{target_file_name}.zip")
# 创建zip文件
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for file_path in file_path_list:
if os.path.isfile(file_path):
# 如果是文件,直接添加到zip中
zipf.write(file_path, os.path.relpath(file_path, os.path.dirname(file_path)))
elif os.path.isdir(file_path):
# 如果是目录,递归添加目录及其子内容
for root, dirs, files in os.walk(file_path):
for file in files:
file_full_path = os.path.join(root, file)
arcname = os.path.relpath(file_full_path, os.path.dirname(file_path))
zipf.write(file_full_path, arcname)
# 确保即使目录为空也被添加
if not files and not dirs:
arcname = os.path.relpath(root, os.path.dirname(file_path)) + '/'
zipf.writestr(arcname, '')
return zip_path
if __name__ == '__main__':
# 存放目录或文件的列表
_file_path_list = [r'D:\ljh\project\test\test_path\new', // 存有子文件和子目录
r'D:\ljh\project\test\test_path\test_dir', // 空目录
r'D:\ljh\project\test\test_path\docx_file.docx',
r'D:\ljh\project\test\test_path\test.txt']
_target_dir = r'D:\ljh\project\test\test_path\target_dir' //压缩后目标目录
_zip_path = zip_files_and_dirs(_file_path_list, _target_dir, 'output') // 压缩打包, 'output'为压缩的文件名(output.zip)
print(f"ZIP 文件已创建:{_zip_path}")
2、输出结果:
ZIP 文件已创建:D:\ljh\project\test\test_path\target_dir\output.zip
标签:target,zip,python,压缩文件,file,test,path,os,打包
From: https://www.cnblogs.com/lanjianhua/p/18563121