Один метод, чтобы упаковать всё: история создания huntzip — быстрой библиотеки для архивов.
Hello World!
Однажды мне понадобилось добавить работу с архивами в свой проект. И тут я понял одну простую вещь: красивого кода без кучи лишних строк в Python ты просто так не получишь.Для .zip тебе нужен zipfile, для .tar — tarfile, а для .7z вообще приходится качать сторонние библиотеки. С такими темпами проект моментально превращается в уродливый забор из импортов и бесконечных проверок if/elif.Мне это надоело, и я решил создать ультимативную библиотеку, где .7z, .tar.gz, .zip и прочие форматы работают из одной строчки кода прямо «из коробки». Назвал я её — huntZip.
Что я изменил и почему это работает лучше:
- Единый синтаксис для всего. Больше не нужно помнить, что в одной библиотеке для упаковки используется метод write(), а в другой — add(). Теперь за всё отвечают две простые и понятные функции: pack() и unpack().
- Умное определение формата. Библиотека сама сканирует расширение файла (будь то .zip, .7z или сложные цепочки вроде .tar.gz). Писать громоздкие проверки через if/elif в своём коде больше не придётся.
- Чистый Python без костылей. Под капотом используются только нативные модули и современные библиотеки. Никаких вызовов сторонних утилит вроде 7z.exe через subprocess — всё работает внутри самого Python.
- Максимальная скорость и лёгкость. Для ZIP и TAR задействованы встроенные инструменты, написанные на C, что гарантирует работу на полной скорости процессора, а для 7z выбран самый легковесный современный модуль.
- Абсолютная кроссплатформенность. Код никак не привязан к системному софту конкретной операционной системы. Инструмент будет одинаково стабильно работать на Windows, macOS и любых дистрибутивах Linux.
- Установка в одну команду. Проект полностью оформлен и опубликован в PyPI. Его можно мгновенно подключить в любой свой проект обычной командой pip install huntzip без ручного копирования файлов.
А как же выглядит код с моей библиотекой?
from huntzip import pack, unpack
Упаковать папку в ZIP? Легко:
pack("my_project", "backup.zip")
Передумал и хочешь максимальное сжатие в 7z? Просто меняешь расширение:
pack("my_project", "backup.7z")
Нужен tar.gz для Linux-сервера? Точно так же:
pack("my_project", "backup.tar.gz")
А распаковка любой этой радости делается в одну строчку:
unpack("backup.7z", "extracted_ready")
И так скоро будет с любым форматом! В планах добавить полную поддержку .rar и .cab. Не знаю, насколько это окажется сложно под капотом, но, как говорится: не попробуешь — не узнаешь!