Если часто работаете с архивами, то наверняка знакомы с модуле | Python Заметки
Если часто работаете с архивами, то наверняка знакомы с модулем zipfile.
Нет ничего сложного добавить директорию в архив.
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'
aip_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