前记
需要拿取多个位置的文件、文件夹的内容组成一个zip文件并返回前端。
zipfile
- 使用的是python的zipfile库
代码块
- 保留原格式(即原始文件夹目录)的写入文件夹方式
import zipfile
with zipfile.ZipFile('example.zip', 'w') as zip:
# 创建空的ZipInfo对象
folder = zipfile.ZipInfo('folder/')
# 设置压缩类型为目录
folder.external_attr = 0x10
# 写入ZipInfo对象到zip文件
zip.writestr(folder, '')
# 添加文件到文件夹中
with open('file.txt', 'rb') as f:
zip.write('file.txt', 'folder/file.txt')
- 写入文件及文件夹(不确定是否有文件夹目录)
import zipfile
import os
# 定义要压缩的文件和目录
file_paths = ['path/to/file1.txt', 'path/to/dir']
# 定义压缩文件名和路径
zip_file = zipfile.ZipFile('compressed.zip', 'w')
# 遍历所有文件和目录并写入压缩文件中
for file_path in file_paths:
if os.path.isfile(file_path):
# 如果是文件,则直接写入到压缩文件中
zip_file.write(file_path)
elif os.path.isdir(file_path):
# 如果是目录,则递归遍历子目录并写入到压缩文件中
for root, dirs, files in os.walk(file_path):
for file in files:
abs_path = os.path.join(root, file)
rel_path = os.path.relpath(abs_path, file_path)
zip_file.write(abs_path, rel_path)
# 关闭压缩文件
zip_file.close()
- 写入文件夹
import os
import zipfile
def zip_folders(folders, output_path):
with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as my_zip:
for folder in folders:
for root, dirs, files in os.walk(folder):
# 获取相对路径
relative_path = os.path.relpath(root, folder)
# 添加文件夹到zip包中
my_zip.write(root, os.path.join(relative_path))
# 添加所有文件到zip包中
for file in files:
file_path = os.path.join(root, file)
my_zip.write(file_path, os.path.join(relative_path, file))
folders = ['/path/to/folder1', '/path/to/folder2']
output_path = '/path/to/output.zip'
zip_folders(folders, output_path)
集成函数
- 以下代码参数中区分了文件列表和文件夹列表。也可以写在一个列表中,遍历时判断。
- 传入的应为完整路径
import zipfile
import re
import os
def filetozip(self, zip_name: str, file_path_list: list, dir_path_list:list):
"""
压缩指定文件夹
:zip_name: '/home/school.zip'
:file_path_list: ['/home/name/zhangsan.txt', '/home/name/lisi.txt']
:dir_path_list: ['/home/grages', '/home/class']
"""
# 创建zip文件
zip =zipfile.ZipFile(zip_name, mode='w', compression=zipfile.ZIP_DEFLATED)
# 文件写入
for file in file_path_list:
# 找到上层目录名
#title = re.findall(r'/home/(.+?)/',file)[0]
title = os.path.basename(os.path.dirname(file)) # 'name'
# 创建模块目录(name)
folder = zipfile.ZipInfo(title)
# 设置压缩类型为目录
folder.external_attr = 0x10
# 找到文件名
parent_path, file_name = os.path.split(file)
# 添加文件夹到对应目录下(name目录下)
zip.write(file, os.path.join('', title, file_name))
# 文件夹写入(由具体需求设计)
for dir in dir_path_list:
# 当前目录
dir_path = os.path.basename(dir)
# dir_path = dir.split('/')[-1]
# title = re.findall(r'/home/(.+?)/',dir)[0]
#上一级目录
title = os.path.basename(os.path.dirname(dir))
# 遍历文件
for path, dirnames, filenames in os.walk(dir):
# 创建多级目录,第一级(/home)
folder = zipfile.ZipInfo(os.path.dirname(title))
folder.external_attr = 0x10
# 创建第二级目录(grades或class)
folder = zipfile.ZipInfo(os.path.join(title , dir_path))
folder.external_attr = 0x10
#添加文件到对应目录即(/home/grages下或/home/class下)
for filename in filenames:
file_path = os.path.join(path, filename)
zip.write(file_path, os.path.join('', module_name, dir_path, filename))
引用
Python打包文件夹为ZIP
zipfile — 使用ZIP存档
【zipfile】Python实现将文件打包为zip压缩包 & 解压