Как создать zip для одного файла?

Попробовал использовать shutil.make_archive для создания архива из файла, а не папки, т.к. на английском стеке кто-то выложил ответ с таким решением, но у меня файл в архиве лежал не в корне, а по пути повторяющем его текущий путь, типа:

C:\Users\ipetrash\PycharmProjects\SimplePyScripts\sqlite3__examples\databases\backup\backup_2024-07-01.db.zip\Users\ipetrash\PycharmProjects\SimplePyScripts\sqlite3__examples\databases\backup

введите сюда описание изображения

Для:

import shutil
print(shutil.make_archive(file_name_backup.name, "zip", DIR_DB_BACKUP, file_name_backup))
# C:\Users\ipetrash\PycharmProjects\SimplePyScripts\sqlite3__examples\backup_2024-07-01.db.zip

print(shutil.make_archive(file_name_backup, "zip", DIR_DB_BACKUP, file_name_backup))
# C:\Users\ipetrash\PycharmProjects\SimplePyScripts\sqlite3__examples\databases\backup\backup_2024-07-01.db.zip

Подозреваю, что если менять текущую активную директорию перед архивированием, то это поможет размещать файл в архив в корне, но это не теория, да и потом возвращать его... Неудобно...

Какое может быть решение?


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

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

Нашел решение через работу с zipfile.ZipFile

import zipfile
from pathlib import Path


def create_zip_for_file(file_name_zip: str | Path, file_name: Path, delete_file_name: bool = True):
    with zipfile.ZipFile(file_name_zip, mode="w", compression=zipfile.ZIP_DEFLATED) as f:
        f.write(file_name, arcname=file_name.name)

    if delete_file_name:
        file_name.unlink()

Пример использования, чтобы архивировать текущий файл скрипта:

FILE_NAME = Path(__file__).resolve()
create_zip_for_file(f"{FILE_NAME}.zip", FILE_NAME, delete_file_name=False)

Результат: введите сюда описание изображения

→ Ссылка