Нет ничего сложного добавить директорию в архив.
import zipfileДовольно немногословно. Но можно короче! В модуле
from pathlib import Path
dir_name = '~/input_files'
zip_name = '~/archive.zip'
with zipfile.ZipFile(zip_name, 'w') as zip:
for file in Path(dir_name).glob('**/*'):
zip.write(file, file.relative_to(dir_name).as_posix())
shutil уже есть готовый методdir_name = '~/input_files'А что насчет распаковки?
zip_name = '~/archive'
zip_file = shutil.make_archive(zip_name, 'zip', root_dir=dir_name)
Здесь проще, даже с
zipfile это одна строкаzip_file = '~/archive.zip'Ну и тем более в
out_dir = '~/out_dir'
zipfile.ZipFile(zip_file).extractall(out_dir)
shutil
shutil.unpack_archive(zip_file, out_dir)В примерах не делается expanduser для краткости
▫️ В данном случае функция из
shutil более универсальна, так как второй аргумент format задаёт алгоритм сжатия, от чего зависит выбор библиотеки. Если написать формат tar, то вместо zipfile будет использоваться tarfile.Поддерживаются форматы
zip, tar, gztar, bztar, xztar. Но только если на текущем хосте доступны соответствующие библиотеки.▫️ Из недостатков можно назвать невозможность запаковать просто один файл. Источником может быть только директория. Проблема легко решается, но всё же.
▫️ Интересный момент. При наличии в Python2 функции
shutil.make_archive() там отсутствует shutil.unpack_archive(). А появился он только в 3.7! Не очень понятно почему, но это еще один повод переходить на Python3 😊#libs #tricks