Работа с zip-архивами в Python, модуль zipfile

23.02.2018

Теги: PythonWeb-разработкаМодуль

Модуль zipfile (входит в стандартный набор python) позволяет работать с zip-архивами. Чтобы записать или прочитать содержимое zip-файла, прежде всего необходимо создать объект ZipFile. Объекты ZipFile похожи на объекты File, возвращаемые функцией open().

ZipFile(filename [,mode[,compression[,allowZip64]]])
  • filename — имя файла zip архива.
  • mode
    • 'r' — файл будет открыт для чтения (это режим по умолчанию);
    • 'w' — файл будет открыт для записи; если файл не существует, он будет создан; если файл существует, он будет перезаписан;
    • 'a' — существующий файл будет открыт в режиме добавления файлов в архив.
  • compression определяет метод сжатия, который должен использоваться при записи в архив. Он принимает одно из значений: ZIP_STORED или ZIP_DEFLATED. По умолчанию используется значение ZIP_STORED.
  • allowZip64 позволяет разрешить использование расширений ZIP64, которые дают возможность создавать архивы размером больше 2 гигабайт. По умолчанию равен False.

Создание архива, запись файлов и директорий:

>>> import os, zipfile
>>> os.chdir('C:\\example')
>>> os.listdir()
['images', 'readme.txt']
>>> zipFile = zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED)
>>> zipFile.write('readme.txt') [grn]# добавляем файл в архив[/grn]
>>> zipFile.write('images') [grn]# добавляем (пустую) директорию в архив[/grn]
>>> zipFile.write('images\\1.jpg')
>>> zipFile.write('images\\2.jpg')
>>> zipFile.close()

Получение информации о содержимом zip-архива:

>>> zipFile = zipfile.ZipFile('archive.zip', 'r')
>>> zipFile.namelist() [grn]# получаем информацию о файлах и директориях[/grn]
['readme.txt', 'images/', 'images/1.jpg', 'images/2.jpg']
>>> zipInfo = zipFile.getinfo('readme.txt') [grn]# получаем информацию об отдельном файле[/grn]
>>> zipInfo.file_size
13908
>>> zipInfo.compress_size
3828
>>> zipFile.close()

Извлечение файлов из архива:

>>> zipFile = zipfile.ZipFile('archive.zip', 'r')
>>> zipFile.extract('readme.txt') [grn]# извлекаем отдельный файл из корня архива[/grn]
'C:\\example\\readme.txt'
>>> zipFile.extract('images/1.jpg') [grn]# извлекаем отдельный файл из директории images[/grn]
'C:\\example\\images\\1.jpg'
>>> zipFile.extractall() [grn]# извлекаем весь архив в текущую директорию[/grn]
>>> zipFile.extractall('archive') [grn]# извлекаем весь архив в директорию archive[/grn]
>>> zipFile.close()

Функция zipfile.is_zipfile() проверяет, является ли файл архивом или нет. Если да, то она вернет True, если нет — False.

# Копирует директорию со всем ее содержимым в
# zip-файл с инкрементным номером в имени файла

import zipfile, os

def backupToZip(source, backup):
    """Создание резервной копии всего содержимого директории source"""

    # Проверить, что обе директории существуют
    if not (os.path.isabs(source) and os.path.isdir(source)):
        print('Директория %s не существует' % (source))
        return
    if not (os.path.isabs(backup) and os.path.isdir(backup)):
        print('Директория %s не существует' % (backup))
        return

    # Определить, какое имя файла будет у zip-архива,
    # исходя из имен уже существующих файлов
    number = 1
    while True:
        name = os.path.basename(source) + '-' + str(number) + '.zip'
        backupFile = os.path.join(backup, name)
        if not os.path.isfile(backupFile):
            break
        number = number + 1

    # Создание нового zip-файла
    print('Создание нового zip-файла %s...' % (backupFile))
    zipFile = zipfile.ZipFile(backupFile, 'w')

    # Обход всего дерева директории и сжатие файлов в каждой папке
    archDirName = ''
    for dir, subdirs, files in os.walk(source):
        print('Добавление файлов из директории %s...' % (dir))
        # Имя текущей директории в архиве
        archDirName = '/'.join([archDirName, os.path.basename(dir)]).strip('/')
        # Добавить в архив текущую директорию
        zipFile.write(dir, archDirName)

        # Добавить в архив все файлы из текущей директории
        for file in files:
            # Имя текущего файла в архиве
            archFileName = archDirName + '/' + file
            zipFile.write(os.path.join(dir, file), archFileName)

    zipFile.close()
    print('Готово')

backupToZip('C:\\project', 'C:\\backup')

Поиск: Python • Web-разработка • zip • Модуль

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.