
Работа с архивами – частая задача при обработке данных, особенно если проекту требуется автоматическая распаковка файлов перед анализом. В Python встроенные модули zipfile, tarfile и shutil позволяют обойтись без сторонних библиотек, что удобно для кроссплатформенных скриптов и деплоймента.
Модуль zipfile поддерживает чтение и извлечение содержимого ZIP-архивов, включая работу с паролями, а tarfile обеспечивает доступ к формату TAR и его сжатым версиям (tar.gz, tar.bz2). Для форматов, не поддерживаемых стандартной библиотекой, можно подключить patool или py7zr, расширяя возможности до 7z, rar и других контейнеров.
Оптимальная практика – проверка архива перед извлечением: zipfile.is_zipfile() или tarfile.is_tarfile() позволяют избежать ошибок выполнения. При работе с большими файлами важно использовать iterators и извлечение поэлементно, чтобы не перегружать оперативную память.
Использование модуля zipfile для чтения ZIP-архивов

Модуль zipfile входит в стандартную библиотеку Python и позволяет работать с ZIP-архивами без сторонних зависимостей. Он поддерживает просмотр содержимого, выборочное извлечение файлов и чтение данных в памяти.
Пример базового открытия архива и получения списка файлов:
import zipfile
with zipfile.ZipFile("archive.zip", "r") as zf:
print(zf.namelist())
Метод namelist() возвращает список путей внутри архива, включая вложенные директории.
Чтобы извлечь один файл без распаковки всего архива:
with zipfile.ZipFile("archive.zip", "r") as zf:
with zf.open("docs/readme.txt") as file:
content = file.read().decode("utf-8")
print(content)
Полная распаковка:
with zipfile.ZipFile("archive.zip", "r") as zf:
zf.extractall("output_folder")
Рекомендации при работе:
- Проверяйте целостность архива через
zf.testzip(); возврат имени файла означает ошибку CRC. - Используйте менеджер контекста
withдля автоматического закрытия архива. - Для больших файлов читайте данные потоково через
open(), избегая загрузки целого содержимого в память. - Обрабатывайте исключения
zipfile.BadZipFileдля защиты от поврежденных архивов.
Модуль подходит для сценариев, где требуется быстрый доступ к содержимому без промежуточной распаковки.
Извлечение отдельных файлов из архива по имени

Для выборочного извлечения удобно использовать модуль zipfile. Откройте архив в режиме ‘r’ и вызовите метод extract(), передав имя нужного файла:
import zipfile
with zipfile.ZipFile("data.zip", "r") as z:
z.extract("report.csv", path="output")
Метод extract() возвращает полный путь к извлеченному файлу, что полезно для последующей обработки. Если имя файла неизвестно, можно просмотреть список доступных объектов через namelist() и выбрать нужный:
files = z.namelist()
if "report.csv" in files:
z.extract("report.csv", "output")
Для tar-архивов применяйте модуль tarfile с методом extract() или extractfile(), если нужно получить файловый объект без записи на диск:
import tarfile
with tarfile.open("backup.tar.gz", "r:gz") as t:
member = t.getmember("config.yaml")
t.extract(member, "config_dir")
Проверяйте наличие целевого файла в архиве перед извлечением, чтобы избежать ошибок KeyError. Для безопасности избегайте относительных путей вида ../, используя os.path.normpath() и проверку, что итоговый путь находится внутри рабочей директории.
Работа с паролями при разархивировании ZIP

Для распаковки защищённых паролем ZIP-архивов в Python используется метод ZipFile.extractall() с параметром pwd. Пароль должен быть передан в виде байтов: pwd=b"mypassword". Пример:
from zipfile import ZipFile
with ZipFile("secure.zip") as zf:
zf.extractall(pwd=b"1234")
Важно учитывать, что стандартный модуль zipfile поддерживает только шифрование PKZIP. Если архив использует AES, потребуется библиотека pyzipper, которая поддерживает WZ_AES и позволяет работать с длинными паролями.
Рекомендуется перед распаковкой проверять наличие пароля методом ZipFile.infolist() и свойством flag_bits для каждого файла: если установлен бит шифрования, попытка извлечения без пароля вызовет RuntimeError. Это позволяет заранее запросить пароль у пользователя.
Не храните пароли в открытом виде в коде. Используйте переменные окружения или защищённое хранилище ключей, чтобы избежать утечек. При обработке большого количества архивов автоматизируйте ввод пароля с проверкой корректности через try/except и обработку исключения RuntimeError.
Разбор и извлечение TAR и GZ архивов с модулем tarfile

Модуль tarfile из стандартной библиотеки Python позволяет работать с форматами .tar и .tar.gz без сторонних пакетов. Он поддерживает чтение, запись и потоковую обработку архивов, что удобно при работе с большими файлами.
Открытие архива выполняется с помощью функции tarfile.open(), где важен режим:
r– чтение несжатого TAR;r:gz– чтение GZ-архива;w,w:gz– создание архива.
Пример извлечения всех файлов:
import tarfile
with tarfile.open("backup.tar.gz", "r:gz") as tar:
tar.extractall(path="output_dir")
Для выборочного извлечения используйте getmember() или getmembers():
with tarfile.open("backup.tar", "r") as tar:
member = tar.getmember("data/config.json")
tar.extract(member, path="config_only")
Для анализа содержимого архива полезно:
tar.getnames()– получить список путей;tar.getmembers()– доступ к объектам с метаданными;- проверять
member.isreg()иmember.isdir()перед извлечением.
Рекомендации:
- Используйте менеджер контекста
withдля автоматического закрытия архива; - Избегайте
extractall()с недоверенными архивами – проверяйте имена файлов на наличие../для защиты от Path Traversal; - Для больших архивов используйте
tarfile.open(..., stream=True)(Python 3.12+) для пофайловой обработки.
Обработка ошибок при поврежденных архивах

При работе с архивами часто встречается ситуация, когда файл поврежден или частично недоступен. В Python важно не только отлавливать ошибки, но и корректно реагировать на них, чтобы предотвратить потерю данных или падение программы.
Для zip-архивов используется модуль zipfile, который выбрасывает исключение zipfile.BadZipFile при попытке открыть поврежденный архив. В случае tar-архивов модуль tarfile генерирует tarfile.ReadError. Эти исключения нужно обрабатывать в конструкции try...except с логированием и возможностью пропуска проблемного файла.
| Тип архива | Исключение | Рекомендация |
|---|---|---|
| ZIP | zipfile.BadZipFile |
Вывести предупреждение, записать в лог, предложить пользователю выбрать другой файл. |
| TAR | tarfile.ReadError |
Пропустить архив или попытаться прочитать отдельные неповрежденные члены архива. |
| Любой | OSError |
Проверить доступность диска, разрешения на чтение, повторить попытку после устранения проблемы. |
Дополнительно стоит проверять контрольные суммы, если они доступны, и при несоответствии автоматически помечать архив как испорченный. Это особенно важно при работе с загруженными из сети файлами. Для повышения надежности рекомендуется создавать резервные копии и выполнять разархивирование во временную директорию, чтобы при сбое не повредить существующие данные.
Автоматическая распаковка всех архивов в папке

Для массовой распаковки удобно использовать модуль pathlib для обхода файлов и встроенные средства работы с архивами. Пример ниже обрабатывает все ZIP-файлы в указанной директории и извлекает их содержимое в подпапки с именами архивов.
python
from pathlib import Path
import zipfile
source = Path("путь/к/папке")
for file in source.glob("*.zip"):
target = source / file.stem
target.mkdir(exist_ok=True)
with zipfile.ZipFile(file, "r") as archive:
archive.extractall(target)
Такой подход предотвращает перезапись файлов, так как для каждого архива создаётся собственная директория. Рекомендуется проверять размер и структуру извлечённых данных, чтобы избежать конфликтов при обработке архивов с одинаковыми именами файлов внутри.
Для поддержки форматов .tar и .tar.gz можно дополнительно использовать модуль tarfile с аналогичным циклом. В промышленных сценариях целесообразно добавить обработку ошибок, логирование и фильтрацию по расширениям через file.suffix.
Вопрос-ответ:
Какие библиотеки в Python подходят для работы с ZIP-файлами?
Для работы с архивами формата ZIP в Python можно использовать стандартную библиотеку zipfile. Она позволяет открывать архивы, просматривать содержимое, извлекать отдельные файлы или все сразу. Кроме того, есть библиотека shutil, которая позволяет распаковывать архивы через функцию unpack_archive, поддерживающую несколько форматов, включая ZIP. Для работы с архивами других форматов, таких как RAR, можно применять сторонние пакеты, например, rarfile.
Как распаковать все файлы из ZIP-архива в конкретную папку?
С помощью модуля zipfile можно открыть архив и вызвать метод extractall, указав путь к папке, куда нужно поместить файлы. Например, сначала открываем архив через zipfile.ZipFile(‘имя_архива.zip’), затем используем zip_ref.extractall(‘путь_к_папке’). Все файлы и папки внутри архива будут извлечены в указанное место, сохраняя структуру директорий.
Можно ли извлечь только один конкретный файл из архива?
Да, в zipfile есть метод extract, который позволяет извлечь конкретный файл. Нужно указать имя файла внутри архива и путь к папке, куда его поместить. Например, zip_ref.extract(‘путь_в_архиве/файл.txt’, ‘папка_назначения’). Это удобно, когда не требуется распаковывать весь архив и нужно получить только отдельные документы.
Существуют ли способы разархивирования других форматов, кроме ZIP, средствами Python?
Да. Стандартный модуль shutil поддерживает распаковку архивов форматов TAR, TAR.GZ и ZIP через функцию unpack_archive. Для форматов RAR или 7z используются сторонние библиотеки, например rarfile и py7zr. Они предоставляют методы для открытия архива, просмотра содержимого и извлечения файлов. При работе с такими библиотеками важно учитывать, что для некоторых форматов может потребоваться установка дополнительных системных утилит.
