Я подготовил функцию, объединив решение Марка Байера с комментариями Реймунда и Мортена Зильмера (относительный путь и включая пустые каталоги). В качестве наилучшей практики with
используется в построении файла ZipFile.
Функция также подготавливает имя файла zip по умолчанию с именем zipped directory и расширением «.zip». Поэтому он работает только с одним аргументом: исходный каталог должен быть заархивирован.
import os
import zipfile
def zip_dir(path_dir, path_file_zip=''):
if not path_file_zip:
path_file_zip = os.path.join(
os.path.dirname(path_dir), os.path.basename(path_dir)+'.zip')
with zipfile.ZipFile(path_file_zip, 'wb', zipfile.ZIP_DEFLATED) as zip_file:
for root, dirs, files in os.walk(path_dir):
for file_or_dir in files + dirs:
zip_file.write(
os.path.join(root, file_or_dir),
os.path.relpath(os.path.join(root, file_or_dir),
os.path.join(path_dir, os.path.pardir)))