Управление ZIP-архивами в Python: работа с модулем zipfile
Для кого эта статья:
- Python-разработчики, желающие улучшить навыки работы с архивами
- Студенты и начинающие программисты, изучающие Python и его стандартные библиотеки
Профессионалы в области DevOps и автоматизации, работающие с большими объемами данных и архивами
Каждый Python-разработчик рано или поздно сталкивается с необходимостью упаковать или распаковать файлы. ZIP-архивы остаются самым распространённым форматом сжатия, и модуль zipfile в Python предоставляет элегантный способ управления ими прямо из кода. Это стандартная библиотека с богатым функционалом, которая избавляет от необходимости обращаться к сторонним утилитам и позволяет полностью автоматизировать работу с архивами. 🗂️ Независимо от того, создаёте ли вы резервные копии, распаковываете загруженные данные или обрабатываете большие массивы файлов – zipfile станет вашим незаменимым инструментом.
Хотите стать профессионалом в работе с файлами, архивами и другими аспектами Python-разработки? Программа Обучение Python-разработке от Skypro поможет освоить не только базовые, но и продвинутые техники программирования. Наши студенты учатся создавать эффективные решения для работы с данными, в том числе мастерски управлять ZIP-архивами через стандартную библиотеку Python. Присоединяйтесь к курсу и получите навыки, востребованные на рынке труда!
Основы модуля zipfile: возможности и преимущества
Модуль zipfile — это часть стандартной библиотеки Python, которая обеспечивает функциональность для работы с архивами в формате ZIP. Этот модуль позволяет создавать, читать, записывать, извлекать и перечислять содержимое ZIP-файлов без необходимости обращения к внешним программам или утилитам. 📦
Ключевые возможности модуля zipfile включают:
- Создание новых ZIP-архивов с нуля
- Добавление файлов и директорий в существующие архивы
- Извлечение всех или выбранных файлов из архива
- Чтение содержимого файлов внутри архива без их извлечения
- Поддержка сжатия данных с различными методами
- Работа с зашифрованными ZIP-файлами
- Проверка целостности архивов
Чтобы начать использовать модуль zipfile, достаточно импортировать его в свой Python-скрипт:
import zipfile
Основные классы модуля zipfile, с которыми вы будете работать:
| Класс | Описание | Основное применение |
|---|---|---|
| ZipFile | Основной класс для работы с ZIP-архивами | Создание, чтение и изменение архивов |
| ZipInfo | Класс, содержащий информацию о файле в архиве | Получение метаданных о файлах в архиве |
| PyZipFile | Подкласс ZipFile для упаковки Python-модулей | Архивирование Python-пакетов |
| BadZipFile | Исключение при ошибке чтения ZIP-файла | Обработка ошибок при работе с повреждёнными архивами |
Преимущества использования встроенного модуля zipfile в Python:
- Кроссплатформенность — код работает одинаково на всех платформах, где установлен Python
- Простота интеграции — не требуются внешние зависимости или установка дополнительных пакетов
- Программный контроль — полный контроль над процессами архивации и разархивации
- Автоматизация — возможность встраивать работу с архивами в автоматизированные скрипты
- Гибкость — работа как с файлами на диске, так и с данными в памяти
Для проверки доступности модуля и его версии можно использовать:
import zipfile
print(f"Используется zipfile версии {zipfile.__version__}")
Максим Петров, ведущий разработчик систем автоматизации
Недавно наша команда столкнулась с необходимостью автоматически обрабатывать тысячи CSV-файлов, которые поступали к нам в ZIP-архивах от партнёров. Раньше мы использовали внешнюю утилиту для распаковки, что требовало дополнительных проверок безопасности и усложняло процесс.
Переход на модуль zipfile позволил сократить код на 40% и полностью интегрировать обработку архивов в основной Python-скрипт. Особенно ценной оказалась возможность читать данные напрямую из архива без промежуточной распаковки на диск — это ускорило обработку на 30% и устранило риски, связанные с хранением временных файлов с конфиденциальными данными.

Создание и наполнение ZIP-архивов через Python
Создание ZIP-архивов с помощью модуля zipfile — интуитивно понятный процесс, который можно реализовать всего несколькими строками кода. Рассмотрим основные сценарии создания и наполнения архивов. 💾
Создание нового ZIP-архива
Для создания нового архива используется класс ZipFile. При инициализации указывается имя архива и режим работы:
import zipfile
# Создание нового архива
with zipfile.ZipFile('example.zip', 'w') as zip_file:
# Здесь будем добавлять файлы в архив
pass
Режимы открытия ZIP-архива:
- 'r' — только чтение (режим по умолчанию)
- 'w' — запись (создаёт новый архив, перезаписывая существующий)
- 'a' — добавление (дополняет существующий архив)
- 'x' — эксклюзивное создание (создаёт архив, выдаёт ошибку если файл уже существует)
Добавление файлов в архив
Метод write() позволяет добавлять файлы в архив:
import zipfile
with zipfile.ZipFile('example.zip', 'w') as zip_file:
# Добавление одного файла
zip_file.write('document.txt')
# Добавление файла с другим именем внутри архива
zip_file.write('config.ini', arcname='settings/config.ini')
Управление сжатием
Python предлагает несколько методов сжатия при создании ZIP-архивов:
| Константа | Описание | Степень сжатия | Скорость |
|---|---|---|---|
| ZIP_STORED | Без сжатия | Отсутствует | Очень высокая |
| ZIP_DEFLATED | Стандартный алгоритм (zlib) | Хорошая | Средняя |
| ZIP_BZIP2 | Сжатие bzip2 | Очень хорошая | Низкая |
| ZIP_LZMA | Сжатие LZMA | Превосходная | Очень низкая |
Пример использования разных методов сжатия:
import zipfile
with zipfile.ZipFile('compressed.zip', 'w', compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zip_file:
zip_file.write('large_file.txt')
# Для файлов, которые уже сжаты (изображения, видео)
with zipfile.ZipFile('media.zip', 'w', compression=zipfile.ZIP_STORED) as zip_file:
zip_file.write('video.mp4')
Архивирование целых директорий
Модуль zipfile не имеет встроенного метода для архивации всех файлов в директории, но это легко реализовать с помощью модуля os:
import os
import zipfile
def zip_directory(path, zip_handle):
# Перебираем все файлы и папки
for root, dirs, files in os.walk(path):
for file in files:
# Формируем полный путь к файлу
file_path = os.path.join(root, file)
# Вычисляем относительный путь для сохранения структуры
arcname = os.path.relpath(file_path, os.path.dirname(path))
# Добавляем файл в архив
zip_handle.write(file_path, arcname)
# Пример использования
with zipfile.ZipFile('project_backup.zip', 'w', compression=zipfile.ZIP_DEFLATED) as zip_file:
zip_directory('my_project', zip_file)
Добавление данных из памяти
Иногда требуется добавить в архив данные, которые находятся в памяти, а не в файле на диске. Для этого используется метод writestr():
import zipfile
with zipfile.ZipFile('generated.zip', 'w') as zip_file:
# Добавление строки как файл
zip_file.writestr('hello.txt', 'Hello, world!')
# Добавление данных с использованием ZipInfo для указания метаданных
info = zipfile.ZipInfo('timestamp.txt')
info.date_time = (2023, 10, 15, 12, 30, 0) # Установка даты и времени
info.compress_type = zipfile.ZIP_DEFLATED
zip_file.writestr(info, 'Generated at 12:30')
Извлечение и чтение данных из ZIP-файлов
Когда дело доходит до извлечения содержимого ZIP-архивов, модуль zipfile предоставляет разнообразные инструменты для работы с файлами. Рассмотрим основные методы извлечения и чтения данных из архивов. 🔍
Александра Иванова, DevOps-инженер
Работая над системой непрерывной интеграции, мы столкнулись с интересной задачей: нужно было анализировать артефакты сборки, которые поставлялись в виде ZIP-архивов размером до 2 ГБ. Извлечение всего архива на диск занимало много времени и требовало дополнительного места.
Мы разработали решение с использованием модуля zipfile, которое позволяло читать только необходимые для анализа файлы непосредственно из архива без полной распаковки. Реализовали кэширование структуры архива и поиск по паттернам имён файлов, что позволило обрабатывать только релевантные данные. В результате время обработки снизилось с 15 минут до 40 секунд, а потребление дискового пространства уменьшилось на 80%. Самым сложным оказалось обеспечить эффективный доступ к файлам в глубоких директориях, но методы
namelist()иgetinfo()из zipfile нам отлично помогли.
Получение информации о содержимом архива
Прежде чем извлекать файлы, часто необходимо узнать, что содержится в архиве:
import zipfile
with zipfile.ZipFile('example.zip', 'r') as zip_file:
# Получение списка всех файлов и директорий в архиве
file_list = zip_file.namelist()
print(f"В архиве содержится {len(file_list)} элементов:")
for filename in file_list:
print(f" – {filename}")
# Получение подробной информации о файле
info = zip_file.getinfo('document.txt')
print(f"Размер до сжатия: {info.file_size} байт")
print(f"Сжатый размер: {info.compress_size} байт")
ratio = (info.file_size – info.compress_size) / info.file_size * 100
print(f"Степень сжатия: {ratio:.1f}%")
print(f"Дата изменения: {info.date_time}")
Извлечение всего архива
Метод extractall() позволяет распаковать все содержимое архива:
import zipfile
with zipfile.ZipFile('example.zip', 'r') as zip_file:
# Извлечение всех файлов в текущую директорию
zip_file.extractall()
# Извлечение в указанную директорию
zip_file.extractall('extracted_files')
# Извлечение только определённых файлов
zip_file.extractall(members=['document.txt', 'images/photo.jpg'])
# Извлечение с обработкой паролей
zip_file.extractall(pwd=b'secret_password')
Извлечение отдельных файлов
Для извлечения конкретных файлов используйте метод extract():
import zipfile
with zipfile.ZipFile('example.zip', 'r') as zip_file:
# Извлечение одного файла в текущую директорию
zip_file.extract('document.txt')
# Извлечение файла в указанную директорию
zip_file.extract('document.txt', 'output')
# Извлечение зашифрованного файла
zip_file.extract('secure_data.dat', pwd=b'secret_password')
Чтение содержимого файлов без извлечения
Одно из главных преимуществ модуля zipfile — возможность читать содержимое файлов прямо из архива без их извлечения на диск:
import zipfile
with zipfile.ZipFile('example.zip', 'r') as zip_file:
# Чтение текстового файла
text_data = zip_file.read('document.txt').decode('utf-8')
print(f"Содержимое document.txt: {text_data[:50]}...")
# Чтение зашифрованного файла
secure_data = zip_file.read('secure_data.dat', pwd=b'secret_password')
# Открытие файла как файлоподобного объекта
with zip_file.open('config.ini') as config_file:
for line in config_file:
print(line.decode('utf-8').strip())
Проверка целостности архива
Перед извлечением данных полезно проверить целостность архива:
import zipfile
try:
with zipfile.ZipFile('example.zip', 'r') as zip_file:
# Проверка всех файлов в архиве
test_result = zip_file.testzip()
if test_result is not None:
print(f"Архив поврежден. Проблемный файл: {test_result}")
else:
print("Архив не содержит ошибок.")
# Продолжаем извлечение или чтение
except zipfile.BadZipFile:
print("Файл не является ZIP-архивом или сильно поврежден.")
Фильтрация файлов при извлечении
Часто требуется извлечь только файлы, соответствующие определенному критерию:
import zipfile
import os
with zipfile.ZipFile('example.zip', 'r') as zip_file:
# Получаем список всех файлов
all_files = zip_file.namelist()
# Фильтруем только текстовые файлы
text_files = [f for f in all_files if f.endswith('.txt')]
# Фильтруем файлы по директории
image_files = [f for f in all_files if f.startswith('images/')]
# Извлекаем только текстовые файлы
zip_file.extractall(members=text_files, path='text_only')
Продвинутые операции с модулем zipfile Python
После освоения основ работы с ZIP-архивами, пришло время рассмотреть более сложные и специализированные операции, которые позволяют расширить возможности использования модуля zipfile. Эти техники помогут эффективно решать нестандартные задачи и работать с архивами на профессиональном уровне. 🚀
Создание самораспаковывающихся архивов
Хотя Python напрямую не создаёт EXE-файлы для самораспаковки, можно сгенерировать скрипт, который будет автоматически распаковывать архив:
import zipfile
import os
def create_self_extracting_script(zip_path, output_script):
"""Создаёт Python-скрипт для автоматической распаковки архива"""
script_content = f'''
import zipfile
import os
import sys
def extract():
zip_path = os.path.join(os.path.dirname(sys.argv[0]), "{os.path.basename(zip_path)}")
extract_dir = input("Введите путь для распаковки [текущая директория]: ").strip()
if not extract_dir:
extract_dir = os.getcwd()
if not os.path.exists(extract_dir):
os.makedirs(extract_dir)
print(f"Распаковка архива {zip_path} в {extract_dir}...")
try:
with zipfile.ZipFile(zip_path, 'r') as zip_file:
zip_file.extractall(extract_dir)
print("Распаковка завершена успешно!")
except Exception as e:
print(f"Ошибка распаковки: {{e}}")
if __name__ == "__main__":
extract()
'''
with open(output_script, 'w') as f:
f.write(script_content)
print(f"Скрипт самораспаковки создан: {output_script}")
# Пример использования
create_self_extracting_script('project_data.zip', 'extract_project.py')
Работа с многотомными архивами
Модуль zipfile поддерживает работу с многотомными (split) ZIP-архивами начиная с Python 3.8:
import zipfile
# Чтение многотомного архива
with zipfile.ZipFile('archive.zip.001', 'r') as zip_file:
# zipfile автоматически объединяет тома
print(zip_file.namelist())
# Извлечение как обычно
zip_file.extractall('extracted')
Обработка комментариев в ZIP-архивах
ZIP-архивы могут содержать комментарии как для всего архива, так и для отдельных файлов:
import zipfile
# Добавление комментария к архиву
with zipfile.ZipFile('commented.zip', 'w') as zip_file:
zip_file.comment = b"Архив создан с помощью Python zipfile"
# Добавление файла с комментарием
info = zipfile.ZipInfo('data.txt')
info.comment = b"Важные данные"
zip_file.writestr(info, "Содержимое файла")
# Чтение комментариев
with zipfile.ZipFile('commented.zip', 'r') as zip_file:
print(f"Комментарий архива: {zip_file.comment.decode('utf-8')}")
for filename in zip_file.namelist():
file_info = zip_file.getinfo(filename)
if file_info.comment:
print(f"Комментарий к {filename}: {file_info.comment.decode('utf-8')}")
Работа с ZipInfo для настройки метаданных
Класс ZipInfo позволяет точно контролировать метаданные файлов в архиве:
import zipfile
import time
import datetime
# Создаем ZipInfo объект с настраиваемыми атрибутами
info = zipfile.ZipInfo('custom_file.txt')
# Устанавливаем время создания (год, месяц, день, час, минута, секунда)
info.date_time = datetime.datetime.now().timetuple()[:6]
# Устанавливаем права доступа к файлу (для Unix/Linux)
# 0o644 соответствует rw-r--r--
info.external_attr = 0o644 << 16
# Устанавливаем метод сжатия
info.compress_type = zipfile.ZIP_DEFLATED
info.compress_size = 0 # Будет обновлено автоматически
with zipfile.ZipFile('metadata_example.zip', 'w') as zip_file:
# Добавляем файл с настроенными метаданными
zip_file.writestr(info, "Содержимое файла с настроенными метаданными")
Обработка больших ZIP-архивов с минимальным использованием памяти
При работе с большими архивами важно оптимизировать использование памяти. Вот эффективный способ обработки больших файлов в ZIP-архивах:
import zipfile
import os
def process_large_zip(zip_path, process_function, chunk_size=8192):
"""
Обрабатывает большие файлы в ZIP-архиве с минимальным использованием памяти.
:param zip_path: путь к ZIP-архиву
:param process_function: функция для обработки содержимого файла
:param chunk_size: размер читаемого блока данных
"""
with zipfile.ZipFile(zip_path, 'r') as zip_file:
for filename in zip_file.namelist():
# Пропускаем директории
if filename.endswith('/'):
continue
print(f"Обработка {filename}...")
# Открываем файл в архиве
with zip_file.open(filename) as file:
# Обрабатываем данные блоками
while True:
chunk = file.read(chunk_size)
if not chunk:
break
# Применяем функцию обработки к блоку данных
process_function(filename, chunk)
# Пример функции обработки
def count_bytes(filename, data):
print(f"Обработан блок данных из {filename}: {len(data)} байт")
# Использование
process_large_zip('large_archive.zip', count_bytes)
Создание архива из объекта в памяти
Иногда требуется создать ZIP-архив в памяти, не записывая его на диск:
import zipfile
import io
# Создаем объект BytesIO для хранения архива в памяти
memory_zip = io.BytesIO()
# Создаем ZIP-архив в памяти
with zipfile.ZipFile(memory_zip, 'w', zipfile.ZIP_DEFLATED) as zip_file:
# Добавляем файлы в архив
zip_file.writestr('file1.txt', 'Содержимое первого файла')
zip_file.writestr('file2.txt', 'Содержимое второго файла')
# Добавляем данные из файла
with open('data.csv', 'rb') as f:
zip_file.writestr('data_copy.csv', f.read())
# Получаем содержимое архива как байты
memory_zip.seek(0)
zip_bytes = memory_zip.getvalue()
# Можно теперь использовать zip_bytes для отправки через API,
# сохранения в базу данных или для других целей
# Пример: сохранение в файл
with open('memory_generated.zip', 'wb') as f:
f.write(zip_bytes)
Оптимизация и безопасность при работе с ZIP-архивами
При разработке решений, использующих ZIP-архивы, важно учитывать вопросы производительности, безопасности и надёжности. Рассмотрим ключевые аспекты оптимизации и безопасной работы с архивами в Python. 🔐
Оптимизация производительности
Работа с ZIP-архивами может быть ресурсоёмкой, особенно при обработке больших файлов. Вот несколько методов оптимизации:
- Выбор правильного метода сжатия — в зависимости от типа данных и требований к скорости/размеру
- Оптимизация уровня компрессии — баланс между размером и скоростью обработки
- Использование контекстных менеджеров — гарантирует закрытие файлов и освобождение ресурсов
- Избирательное извлечение — извлекайте только необходимые файлы вместо всего архива
- Обработка потоками — для распараллеливания операций с несколькими архивами
import zipfile
import os
import concurrent.futures
import time
def compress_file(file_path, compression_type, compression_level):
"""Сжимает отдельный файл с указанными параметрами и возвращает итоговый размер"""
archive_name = f"{os.path.basename(file_path)}.zip"
start_time = time.time()
with zipfile.ZipFile(archive_name, 'w', compression=compression_type,
compresslevel=compression_level) as zip_file:
zip_file.write(file_path, os.path.basename(file_path))
compression_time = time.time() – start_time
compressed_size = os.path.getsize(archive_name)
original_size = os.path.getsize(file_path)
compression_ratio = (original_size – compressed_size) / original_size * 100
return {
'file': file_path,
'original_size': original_size,
'compressed_size': compressed_size,
'ratio': compression_ratio,
'time': compression_time
}
# Сравнение разных методов сжатия
files_to_compress = ['large_text.txt', 'image.jpg', 'database.db']
compression_types = [
(zipfile.ZIP_STORED, 0, "Без сжатия"),
(zipfile.ZIP_DEFLATED, 1, "Быстрое сжатие"),
(zipfile.ZIP_DEFLATED, 9, "Максимальное сжатие"),
(zipfile.ZIP_BZIP2, 9, "BZIP2"),
(zipfile.ZIP_LZMA, 9, "LZMA")
]
for file_path in files_to_compress:
if os.path.exists(file_path):
print(f"Сравнение методов сжатия для файла: {file_path}")
for comp_type, comp_level, comp_name in compression_types:
try:
result = compress_file(file_path, comp_type, comp_level)
print(f" {comp_name}: {result['ratio']:.1f}% сжатие, {result['time']:.3f} сек")
except Exception as e:
print(f" {comp_name}: ошибка – {str(e)}")
Работа с зашифрованными архивами
Модуль zipfile поддерживает шифрование ZIP-архивов, что важно для защиты конфиденциальных данных:
import zipfile
import os
# Создание зашифрованного архива
def create_encrypted_zip(source_dir, zip_name, password):
with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zip_file:
for root, dirs, files in os.walk(source_dir):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, os.path.dirname(source_dir))
# Устанавливаем пароль для шифрования файла
zip_file.write(file_path, arcname)
# Для проверки защищенности
zip_file.setpassword(password)
# Извлечение зашифрованного архива
def extract_encrypted_zip(zip_name, extract_dir, password):
with zipfile.ZipFile(zip_name, 'r') as zip_file:
try:
# Проверяем целостность архива с паролем
bad_file = zip_file.testzip()
if bad_file:
print(f"Обнаружен поврежденный файл: {bad_file}")
return False
# Извлекаем файлы с использованием пароля
zip_file.extractall(path=extract_dir, pwd=password)
return True
except RuntimeError as e:
if "Bad password" in str(e):
print("Неверный пароль для архива")
else:
print(f"Ошибка при извлечении: {e}")
return False
except Exception as e:
print(f"Неожиданная ошибка: {e}")
return False
# Примеры использования
password = b'secret_password123' # Пароль должен быть в байтовом формате
create_encrypted_zip('confidential_data', 'protected.zip', password)
success = extract_encrypted_zip('protected.zip', 'extracted_files', password)
Важно отметить, что ZIP-шифрование имеет известные уязвимости, особенно в старых версиях формата ZIP. Для действительно конфиденциальных данных рекомендуется использовать дополнительные средства шифрования.
Защита от атак типа "Zip Bomb"
ZIP-архивы могут использоваться для атак типа "Zip bomb" — когда маленький архив при распаковке производит огромный объем данных, что может привести к отказу в обслуживании. Вот как можно защититься:
import zipfile
import os
def safe_extract(zip_path, extract_dir, max_size=1024*1024*100, max_files=1000):
"""Безопасное извлечение с проверкой размера и количества файлов"""
with zipfile.ZipFile(zip_path, 'r') as zip_file:
# Проверяем количество файлов
file_list = zip_file.namelist()
if len(file_list) > max_files:
raise ValueError(f"Слишком много файлов в архиве: {len(file_list)} > {max_files}")
# Проверяем потенциальный размер распакованных данных
total_size = sum(info.file_size for info in zip_file.infolist())
if total_size > max_size:
raise ValueError(f"Потенциальный размер распакованных данных превышает лимит: {total_size} > {max_size}")
# Проверяем коэффициент сжатия на подозрительность
compressed_size = sum(info.compress_size for info in zip_file.infolist() if info.compress_type != zipfile.ZIP_STORED)
if compressed_size > 0 and total_size / compressed_size > 1000:
raise ValueError(f"Подозрительно высокий коэффициент сжатия: {total_size/compressed_size:.2f}")
# Если все проверки прошли успешно, извлекаем архив
zip_file.extractall(extract_dir)
return True
# Пример использования
try:
safe_extract('suspicious.zip', 'safe_extract')
print("Архив успешно и безопасно распакован")
except ValueError as e:
print(f"Предотвращена потенциально опасная операция: {e}")
Обработка ошибок и исключений
Важно корректно обрабатывать исключения при работе с ZIP-архивами для повышения надежности приложений:
| Исключение | Описание | Рекомендуемая обработка |
|---|---|---|
| zipfile.BadZipFile | Файл не является ZIP-архивом или поврежден | Сообщить пользователю о некорректном формате файла |
| zipfile.LargeZipFile | ZIP-файл слишком большой (более 4GB для ZIP32) | Использовать ZIP64 формат или разделить архив |
| RuntimeError (с "Bad password") | Неверный пароль для зашифрованного архива | Запросить у пользователя корректный пароль |
| PermissionError | Недостаточно прав для работы с файлом | Запросить повышенные привилегии или изменить расположение файлов |
| OSError | Проблемы с файловой системой или диском | Проверить наличие свободного места и доступность файлов |
import zipfile
import os
import logging
# Настройка логирования
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s – %(name)s – %(levelname)s – %(message)s',
filename='zip_operations.log'
)
logger = logging.getLogger('zip_handler')
def robust_zip_operation(operation_func, *args, **kwargs):
"""Обертка для надежного выполнения операций с ZIP-архивами"""
try:
return operation_func(*args, **kwargs)
except zipfile.BadZipFile:
logger.error(f"Файл не является ZIP-архивом или поврежден: {args[0] if args else ''}")
return {"status": "error", "message": "Файл не является ZIP-архивом или поврежден"}
except zipfile.LargeZipFile:
logger.error(f"ZIP-файл превышает поддерживаемый размер: {args[0] if args else ''}")
return {"status": "error", "message": "ZIP-файл слишком большой, используйте ZIP64 формат"}
except RuntimeError as e:
if "Bad password" in str(e):
logger.error("Неверный пароль для зашифрованного архива")
return {"status": "error", "message": "Неверный пароль для архива"}
logger.error(f"Ошибка выполнения: {str(e)}")
return {"status": "error", "message": f"Ошибка выполнения: {str(e)}"}
except PermissionError:
logger.error("Недостаточно прав для работы с файлом")
return {"status": "error", "message": "Недостаточно прав для работы с файлом"}
except OSError as e:
logger.error(f"Ошибка операционной системы: {str(e)}")
return {"status": "error", "message": f"Ошибка операционной системы: {str(e)}"}
except Exception as e:
logger.error(f"Непредвиденная ошибка: {str(e)}")
return {"status": "error", "message": f"Непредвиденная ошибка: {str(e)}"}
# Пример использования
def extract_zip(zip_path, extract_path):
with zipfile.ZipFile(zip_path, 'r') as zip_file:
zip_file.extractall(extract_path)
return {"status": "success", "message": "Архив успешно распакован"}
# Надежное извлечение
result = robust_zip_operation(extract_zip, "example.zip", "extracted_files")
print(result)
Освоив модуль zipfile, вы получили мощный инструмент для программной работы с ZIP-архивами в Python. Теперь вы можете создавать, читать и модифицировать архивы с минимальными затратами кода, оптимизировать производительность через правильный выбор методов сжатия и уровней компрессии, а также обеспечивать безопасность при работе с конфиденциальными данными. Применяйте полученные знания для автоматизации повседневных задач, обработки больших наборов файлов и интеграции работы с архивами в свои приложения. Помните, что надёжный код должен всегда учитывать потенциальные ошибки и исключительные ситуации — особенно при работе с файловой системой.