Заархивировать множество папок а также потом заархивировать корневую папку в python
Не могли бы подсказать как можно заархивировать при следующем сценарии. Есть такая ирерархия файлов. /ExamFolder/ содержит подпапки Test1Folder, Test2Folder, Test3Folder с различными файлами внутри каждой. необходимо сделать zip архивы каждой Test1Folder.zip, Test2Folder.zip Test3Folder.zip а потом это положить в корневой архив ExamFolder.zip. Тем самым сначала зипуем подпапки индивидуально а потом это все в еще раз зипуем в главный архив. пробовал функцию
def zipfolder(foldername, target_dir):
zipobj = zipfile.ZipFile(foldername + '.zip', 'w', zipfile.ZIP_DEFLATED)
rootlen = len(target_dir) + 1
for base, dirs, files in os.walk(target_dir):
for file in files:
fn = os.path.join(base, file)
zipobj.write(fn, fn[rootlen:])
Но данная функйия при вызове архивирует только главную папку, а подпапки остаються в архиве не .zip.
Ответы (1 шт):
Автор решения: Universall
→ Ссылка
Наверное можно сделать лучше и красивее, но я придумал такой вариант:
import zipfile
import os
import shutil
def zip_dir(path):
os.mkdir("zip_tmp_dir")
dir_name = os.path.split(path)[1]
for _, dirs, _ in os.walk(path):
for d in dirs:
dr = zipfile.ZipFile(os.path.join("zip_tmp_dir", f'{d}.zip'), 'w', zipfile.ZIP_DEFLATED)
for _, _, files in os.walk(os.path.join(path, d)):
for file in files:
dr.write(os.path.join(path, d, file), os.path.join(d, str(file)))
dr.close()
main_zip_dir = zipfile.ZipFile(f'{dir_name}.zip', 'w', zipfile.ZIP_DEFLATED)
for _, _, files in os.walk("zip_tmp_dir"):
for file in files:
main_zip_dir.write(os.path.join("zip_tmp_dir/", file), str(file))
main_zip_dir.close()
shutil.rmtree("zip_tmp_dir", True)
if __name__ == '__main__':
zip_dir('test_1')