Заархивировать множество папок а также потом заархивировать корневую папку в 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')
→ Ссылка