Модуль Python Zipfile

Из документации Python 3

Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и перечисления содержимого ZIP-файла.

Чтение ZIP-файлов

import zipfile

# Открыть ZIP-файл и прочитать его содержимое
with zipfile.ZipFile('example.zip') as example_zip:
    # Вывести список всех файлов и каталогов в ZIP
    print(example_zip.namelist())
    # Получить метаданные для конкретного файла
    spam_info = example_zip.getinfo('spam.txt')
    # Вывести исходный размер файла
    print(spam_info.file_size)
    # Вывести сжатый размер файла
    print(spam_info.compress_size)
    # Рассчитать коэффициент сжатия
    print('Compressed file is %sx smaller!' % (round(spam_info.file_size / spam_info.compress_size, 2)))
['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg']
13908
3828
Compressed file is 3.63x smaller!

Извлечение из ZIP-файлов

Метод extractall() объектов ZipFile извлекает все файлы и папки из ZIP-файла в текущий рабочий каталог.

# Извлечь все файлы из ZIP в текущий каталог
with zipfile.ZipFile('example.zip') as example_zip:
    example_zip.extractall()

Метод extract() объектов ZipFile извлекает один файл из ZIP-файла:

# Извлечь один файл из ZIP
with zipfile.ZipFile('example.zip') as example_zip:
    # Извлечь в текущий каталог (возвращает путь)
    print(example_zip.extract('spam.txt'))
    # Извлечь в определенный каталог
    print(example_zip.extract('spam.txt', '/tmp/some/new/folders'))
/tmp/spam.txt
/tmp/some/new/folders/spam.txt

Создание и добавление в ZIP-файлы

import zipfile

# Создать новый ZIP-файл и добавить в него файл
with zipfile.ZipFile('new.zip', 'w') as new_zip:
    # Добавить файл со сжатием
    new_zip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)

Этот код создаст новый ZIP-файл с именем new.zip, содержащий сжатое содержимое spam.txt.

Чтение метаданных ZIP-файлов

Получение имен файлов с помощью namelist()

import zipfile

# Прочитать ZIP-файл и вывести список всех имен файлов
with zipfile.ZipFile('example.zip', 'r') as zf:
    print(zf.namelist())
['README.txt']

Получение всех метаданных с помощью infolist()

import datetime
import zipfile

# Получить подробные метаданные для всех файлов в ZIP
with zipfile.ZipFile('example.zip') as zf:
    for info in zf.infolist():
        # Определить операционную систему (0 = Windows, 3 = Unix)
        system = 'Windows' if info.create_system == 0 else 'Unix'
        # Преобразовать кортеж date_time в объект datetime
        modified = datetime.datetime(*info.date_time)
        print(info.filename)
        print(f'Comment     : {info.comment}')
        print(f'Modified    : {modified}')
        print(f'System      : {system}')
        print(f'ZIP version : {info.create_version}')
        print(f'Compressed  : {info.compress_size} bytes')
        print(f'Uncompressed: {info.file_size} bytes')
README.txt
Comment     : b''
Modified    : 2022-11-15 06:48:02
System      : Unix
ZIP version : 30
Compressed  : 65 bytes
Uncompressed: 76 bytes

Соответствующие ссылки