Как добавить папку с файлами в архив

Проблема зависит в том, что при помощи Python требуется добавить в архив целую папку с файлами. То есть предположим имеется путь: D:\Direct. В этой папке лежит файл test.py и папка Source, в которой есть еще каталог dist и иконка icon.ico. Задача добавить все эти файлы в архив. То есть заставить программу полностью заархивировать папку Direct со всеми файлами. Пробовал использовать библиотеку zipfile. Но она создает только новую папку и помещает туда файл, а далее все архивирует. Буду крайне благодарен за решения.


Ответы (2 шт):

Автор решения: Kers

Когда давно делал такой скрипт для архивации. Возможно немного надо будет сменить герерацию имен архива под Ваши пожелания.

import zipfile
import os
import datetime

dt = datetime.datetime.now()  # получаем дату и время!
now_date = dt.date().strftime("%Y-%m-%d")  # Текущая дата
now_time = dt.time().strftime("%H-%M-%S")  # Текущее время
backup_folders = ["F:\\Сайт\\your-sitename-here"]  # Список папок для архивации
arch_name = "backup_" + str(now_date) + ".zip"  # имя архива!
ignore_file = ["123.txt"]  # если надо исключить файлы

def mybackup(arch, folder_list, mode):
    # Счетчики
    num = 0
    num_ignore = 0
    # Создание нового архива
    z = zipfile.ZipFile(arch, mode, zipfile.ZIP_DEFLATED, True)
    # Получаем папки из списка папок.
    for add_folder in folder_list:
        # Список всех файлов и папок в директории add_folder
        for root, dirs, files in os.walk(add_folder):
            for file in files:
                if file in ignore_file:  # Исключаем лишние файлы
                    print("Исключен! ", str(file))
                    num_ignore += 1
                    continue
                # Создание относительных путей и запись файлов в архив
                path = os.path.join(root, file)
                z.write(path)
                print(num, path)
                num += 1
    z.close()
    print("------------------------------")
    print("Добавлено: ", num)
    print("Проигнорировано: ", num_ignore)

print(now_time, now_date)
# создаст архив при наличии перезапишет существующий
mybackup(arch_name, backup_folders, "w")
→ Ссылка
Автор решения: el Kryack
#!/usr/bin/env python3
import os
import time
import zipfile

# 1. Файлы и каталоги, которые необходимо скопировать, собираются в список.
source = ['Путь к папке', 'Путь к папке']
# Заметьте, что для имён, содержащих пробелы, необходимо использовать
# двойные кавычки внутри строки.

# 2. Резервные копии должны храниться в основном каталоге резерва.
target_dir = 'Путь к папке бекапов' # Подставьте ваш путь. 

#!!!Пути не должны зацикливаться, не должен бекапить эту папку в неё же!!!

# 3. Файлы помещаются в zip-архив.
# 4. Текущая дата служит именем подкаталога в основном каталоге
today= target_dir + os.sep + time.strftime('%Y_%m_%d')
# Текущее время служит именем zip-архива
now = time.strftime('%H_%M_%S')

# Запрашиваем комментарий пользователя для имени файла
comment = input('Введите комментарий --> ')
if len(comment) == 0: # проверяем, введён ли комментарий
    target = today + os.sep + now + '.zip'
else:
    target = today + os.sep + now + '_' + comment.replace(' ', '_') + '.zip'

# Создаём каталог, если его ещё нет
if not os.path.exists(today):
    os.mkdir(today) # создание каталога
    print('Каталог успешно создан', today)

# 5. Используем команду "zipFile" для помещения всех каталогов и фалов в них в zip-архив

with zipfile.ZipFile(target, 'w', zipfile.ZIP_DEFLATED, True) as myzip:
    for source_folder in source:
        for root,dirs,files in os.walk(source_folder):
            for file in files:
                path = os.path.join(root, file)
                myzip.write(path)
                print(path)

# Выводим на экран лист с папками для создания бекапа, небольшой дебаг, чтобы видет что правильно написаны пути.
print(source)
→ Ссылка