Как открыть zip файл python
Перейти к содержимому

Как открыть zip файл python

  • автор:

Python 3: Работа с zip архивами. Модуль ZipFile

compression определяет метод сжатия, который должен использоваться при записи в архив. Он принимает одно из значений: ZIP_STORED или ZIP_DEFLATED. По умолчанию используется значение ZIP_STORED. Последний аргумент

allowZip64 позволяет разрешить использование расширений ZIP64, которые дают возможность создавать архивы размером больше 2 гигабайт. По умолчанию равен False.

Итак, давайте откроем наш ранее созданный архив для чтения:

Является ли файл zip архивом:

zipfile.is_zipfile('xml_healer.zip') True 

Чтение архива:

z = zipfile.ZipFile('xml_healer.zip', 'r') 

Просмотр содержимого:

z.printdir() 

Извлечение содержимого:

z.extract('file') # Извлечь файл из архива z.extractall() # Извлечь все файлы 

Запись содержимого:

with zipfile.ZipFile('spam.zip', 'w') as myzip: myzip.write('file') 
z = zipfile.ZipFile('spam.zip', 'w') z.write('file') z.close() 

Для записи всех файлов в директории можно воспользоваться функцией os.walk:

import zipfile import os z = zipfile.ZipFile('spam.zip', 'w') # Создание нового архива for root, dirs, files in os.walk('folder'): # Список всех файлов и папок в директории folder for file in files: z.write(os.path.join(root,file)) # Создание относительных путей и запись файлов в архив z.close() 

Закрытие архива:

z.close() 

Ссылки:

  • 13.5. zipfile — Work with ZIP archives
  • Работаем с zip архивами в Python
  • Python — Добавление файлов в архив. Создание копий директорий

Как открыть zip файл python

Zip представляет наиболее популярный формат архивации и сжатия файлов. И язык Python имеет встроенный модуль для работы с ними — zipfile . С помощью этого модуля можно создавать, считывать, записывать zip-файлы, получать их содержимое и добавлять в них файлы. Также поддерживается шифрование, но не поддерживается дешифрование.

Для представления zip-файла в этом модуле определен класс ZipFile . Он имеет следующий конструктор:

ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)
  • file : путь к zip-файлу
  • mode : режим открытия файла. Может принимать следующие значения:
    • r : применяется для чтения существующего файла
    • w : применяется для записи нового файла
    • a : применяется для добавления в файл
    • ZIP_STORED : архивация без сжатия (значение по умолчанию)
    • ZIP_DEFLATED : стандартный тип сжатия при архивации в zip
    • ZIP_BZIP2 : сжатие с помощью способа BZIP2
    • ZIP_LZMA : сжатие с помощью способа LZMA

    Для работы с файлами этот класс предоставляет ряд методов:

    • close() : закрывает zip-файл
    • getinfo() : возвращает информацию об одном файле из архива в виде объекта ZipInfo
    • namelist() : возвращает список файлов архива
    • infolist() : возвращает информацию обо всех файлах из архива в виде списока объектов ZipInfo
    • open() : предоставляет доступ к одному из файлов в архиве
    • read() : считывает файл из архива в набор байтов
    • extract() : извлекает из архива один файл
    • extractall() : извлекает все элементы из архива
    • setpassword() : устанавливает пароль для zip-файла
    • printdir() : выводит на консоль содержимое архива

    Создание и закрытие файла

    Для создания архивного файла в конструктор ZipFile передается режим «w» или «a»:

    from zipfile import ZipFile myzip = ZipFile("metanit.zip", "w")

    После выполнения кода в текущей папке будет создаваться пустой архивный файл «metanit.zip».

    После окончания работы с архивом для его закрытия применяется метод close() :

    from zipfile import ZipFile myzip = ZipFile("metanit.zip", "w") myzip.close()

    Но так как ZipFile также представляет менеджер контекста, то он поддерживает выражение with , которое определяет контекст и автоматически закрывает файл по завершению контекста:

    from zipfile import ZipFile with ZipFile("metanit.zip", "w") as myzip: pass

    Запись файлов в архив

    Для записи файлов в архив применяется файл write() :

    write(filename, arcname=None, compress_type=None, compresslevel=None)

    Первый параметр представляет файл, который записиывается в архив. Второй параметр — arcname устанавливает произвольное имя для файла внутри архива (по умолчанию это само имя файла). Третий параметр — compress_type представляет тип сжатия, а параметр compresslevel — уровень сжатия.

    Например, запишем в архив «metanit.zip» файл «hello.txt» (который, как предполагается, находится в той же папке, где и текущий скрипт python):

    from zipfile import ZipFile with ZipFile("metanit.zip", "w") as myzip: myzip.write("hello.txt")

    Стоит учитывать, что при открытии файла в режиме «w» при всех последующих записях текущее содержимое будет затираться, то есть фактически архивный файл будет создаваться заново. Если нам необходимо добавить, то необходимо определять zip-файл в режиме «a»:

    from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: myzip.write("hello2.txt") myzip.write("forest.jpg")

    Стоит отметить, что по умолчанию сжатие не применяется. Но при необходимости можно применить какой-нибудь способ сжатия и уровень сжатия»

    from zipfile import ZipFile, ZIP_DEFLATED with ZipFile("metanit.zip", "w", compression=ZIP_DEFLATED, compresslevel=3) as myzip: myzip.write("hello.txt")

    Необходимо учитывать, что если мы попробуем добавить в архив файлы с уже имеющимися именами, то консоль выведет предупреждение. Чтобы избежать наличия файлов с дублирующимися именами можно через второй папаметр метода write явным образом определить для них уникальное имя внутри архива:

    from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: myzip.write("hello.txt", "hello1.txt") myzip.write("hello.txt", "hello2.txt") myzip.write("hello.txt", "hello3.txt")

    Получение информации о файлах в архиве

    Метод infolist() возвращает информацию о файлах в архиве с виде списка, где каждый отдельный файл представлен объектом ZipInfo:

    from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: print(myzip.infolist())

    Класс ZipInfo предоставляет ряд атрибутов для хранения информации о файле. Основные из них:

    • filename : название файла
    • date_time : дата и время последнего изменения файла в виде кортежа в формате (год, месяц, день, час, минута, секунда)
    • compress_type : тип сжатия
    • compress_size : размер после сжатия
    • file_size : оригинальный размер файла до сжатия

    Получим эти данные по каждому отдельному файлу в архиве:

    from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: for item in myzip.infolist(): print(f"File Name: Date: Size: ")

    Примерный консольный вывод:

    File Name: hello.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18 File Name: forest.jpg Date: (2022, 11, 19, 20, 46, 52) Size: 103956 File Name: hello1.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18 File Name: hello2.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18 File Name: hello3.txt Date: (2022, 11, 23, 20, 21, 34) Size: 18

    С помощью метода is_dir() можно проверить, является ли элемент в архиве папкой:

    from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: for item in myzip.infolist(): if(item.is_dir()): print(f"Папка: ") else: print(f"Файл: ")

    Если надо получить только список имен входящих в архив файлов, то применяется метод namelist() :

    from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: for item in myzip.namelist(): print(item)

    Консольный вывод в моем случае:

    hello.txt forest.jpg hello1.txt hello2.txt hello3.txt

    С помощью метода getinfo() можно получить данные по одному из архивированных файлов, передав в метод его имя в архиве. Результат метода — объект ZipInfo:

    from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: try: hello_file = myzip.getinfo("hello.txt") print(hello_file.file_size) except KeyError: print("Указанный файл отсутствует")

    Если в архиве не окажется элемента с указанным именем, то метод сгенерирует ошибку KeyError.

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

    Для извлечения всех файлов из архива применяется метод extractall() :

    extractall(path=None, members=None, pwd=None)

    Первый параметр метода устанавливает каталог для извлечения архива (по умолчанию извлечение идет в текущий каталог). Параметр members представляет список строк — список названий файлов, которые надо извлечт из архива. И третий параметр — pwd представляет пароль, в случае если архив закрыт паролем.

    Например, извлечем все файлы из архива:

    from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: myzip.extractall()

    Извлечение в определенную папку:

    myzip.extractall(path="metanit")

    Извлечение части файлов:

    # извлекаем файлы "hello.txt", "forest.jpg" в папку "metanit2" myzip.extractall(path="metanit2", members=["hello.txt", "forest.jpg"])

    Для извлечения одного файла применяется метод extract() , в который в качестве обязательного параметра передается имя извлекаемого файла:

    myzip.extract("hello.txt")

    Считывание файла

    Метод read() позволяет считать содержимое файла из архива в набор байтов:

    from zipfile import ZipFile with ZipFile("metanit.zip", "r") as myzip: content = myzip.read("hello5.txt") print(content)

    Открытие файла

    Метод open() позволяет открывать отдельные файлы из архива без непосредственного их извлечения:

    open(name, mode='r', pwd=None, *, force_zip64=False)

    В качестве первого обязательного параметра передается имя файла внутри архива. Второй параметр — mode устанавливает режим открытия. Параметр pwd задает пароль, если файл защищен паролем. И параметр force_zip64 при значении True позволяет открывать файлы больше 4 Гб.

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

    from zipfile import ZipFile with ZipFile("metanit.zip", "a") as myzip: # записываем в архив новый файл "hello5.txt" with myzip.open("hello5.txt", "w") as hello_file: encoded_str = bytes("Python. ", "UTF-8") hello_file.write(encoded_str)

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

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

    ZipFile(filename [,mode[,compression[,allowZip64]]])
    • filename — имя файла zip архива.
    • mode
      • ‘r’ — файл будет открыт для чтения (это режим по умолчанию);
      • ‘w’ — файл будет открыт для записи; если файл не существует, он будет создан; если файл существует, он будет перезаписан;
      • ‘a’ — существующий файл будет открыт в режиме добавления файлов в архив.

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

      >>> 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
      • Работа с потоками в Python
      • Работа с датой и временем в Python
      • Работа с файлами MS Word в Python
      • Работа с файлами Excel в Python
      • Модуль Selenium, управление браузером
      • Парсинг сайтов, модуль Beautiful Soup

      Каталог оборудования

      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.

      Категории блога
      Облако тегов

      • 1С:Предприятие (31)
      • API (29)
      • Bash (43)
      • CLI (126)
      • CMS (139)
      • CSS (50)
      • Frontend (75)
      • HTML (66)
      • JavaScript (150)
      • Laravel (72)
      • Linux (174)
      • MySQL (76)
      • PHP (125)
      • React.js (66)
      • SSH (27)
      • Ubuntu (70)
      • Web-разработка (509)
      • WordPress (73)
      • Yii2 (69)
      • БазаДанных (95)
      • Битрикс (66)
      • Блог (29)
      • Верстка (43)
      • ИнтернетМагаз… (84)
      • КаталогТоваров (87)
      • Класс (30)
      • Клиент (29)
      • Ключ (28)
      • Команда (88)
      • Компонент (60)
      • Конфигурация (72)
      • Корзина (32)
      • ЛокальнаяСеть (33)
      • Модуль (34)
      • Навигация (31)
      • Настройка (148)
      • ПанельУправле… (29)
      • Плагин (33)
      • Пользователь (26)
      • Практика (101)
      • Сервер (82)
      • Событие (28)
      • Теория (106)
      • Установка (72)
      • Файл (51)
      • Форма (58)
      • Фреймворк (192)
      • Функция (36)
      • ШаблонСайта (68)

      Сжатие и Разархивирование Файлов c Помощью Python

      Если вы пользовались компьютером хоть немного, то возможно вам встречались файлы с расширением .zip. Это специальные файлы в которые могут содержать в сжатом состоянии большое количество других файлов, директорий и поддиректорий. Это делает их очень удобными для передачи данных через интернет. А знаете ли вы, что вы можете использовать Python для сжатия и распаковки архивов?

      В этом уроке вы научитесь как использовать библиотеку zipfile, чтобы извлекать или упаковывать один или сразу несколько файлов в архив.

      Сжатие Одиночных Файлов

      Это очень просто, и потребует написать совсем немного кода. Начинаем с того, что импортируем модуль zipfile и затем инициируем объект ZipFile с возможностью записи, указав это с помощью второго параметра ‘w’. Первый параметр, это путь к файлу. Вот код, который нам нужен:

      import zipfile 
      jungle_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\jungle.zip', 'w') 
      jungle_zip.write('C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED) 
      jungle_zip.close() 

      Пожалуйста, обратите внимание, что я буду указывать путь во всех фрагментах кода в формате для Windows; если вы работаете на Linux или Mac, вам нужно будет внести соответствующие изменения.

      Вы можете указать различные методы сжатия, что бы заархивировать файл. В Python версии 3.3 были добавлены новые методы BZIP2 и LZMA , а также некоторые другие инструменты, которые не поддерживают эти два метода сжатия. По этой причине безопасно использовать метод DEFLATED . Но вам все же стоит попробовать эти методы, что бы увидеть разницу в размерах сжатого файла.

      Сжатие Нескольких Файлов

      Это будет чуть сложнее, так как вы должны выполнить итерационный процесс для всех файлов. Код показанный ниже должен заархивировать все файлы в директории с расширением pdf.

      import os 
      import zipfile 
      fantasy_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\archive.zip', 'w') 
      for folder, subfolders, files in os.walk('C:\\Stories\\Fantasy'): 
      for file in files: 
      if file.endswith('.pdf'): 
      fantasy_zip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), 'C:\\Stories\\Fantasy'), compress_type = zipfile.ZIP_DEFLATED) 
      fantasy_zip.close() 

      На этот раз нам необходимо импортировать модуль os и использовать метод walk() , чтобы пробежаться про всем файлам и поддиректориям в нашей основной директории. Я архивирую только файлы с расширением pdf. Вы так же можете создавать различные архивные файлы для разных форматов файлов используя оператор if .

      Если вы не хотите, сохранить структуру каталога, вы можете положить все файлы вместе, используя следующую строку:

      fantasy_zip.write(os.path.join(folder, file), file, compress_type = zipfile.ZIP_DEFLATED) 

      Метод write() допускает три параметра. Первый параметр — это имя нашего файла, который мы хотим сжать. Второй параметр не обязательный, он позволяет вам указать другое имя для файла архива. Если ничего не указано, будет использоваться имя архивируемого файла.

      Извлечение Всех Файлов

      Вы можете использовать метод extractall() для извлечения всех файлов и папок из zip-файла в текущую рабочую директорию. Вы можете также указать имя папки в extractall() для извлечения всех файлов и директорий в заданный каталог. Если директория, которую вы указали не существует, метод сам создаст новую. Вот код, который вы можете использовать для извлечения файлов:

      import zipfile 
      fantasy_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\archive.zip') 
      fantasy_zip.extractall('C:\\Library\\Stories\\Fantasy') 
      fantasy_zip.close() 

      Если вы хотите распаковать несколько файлов, вам необходимо подставить имена этих файлов в виде списка.

      Извлечение Единичных Файлов

      Это подобно извлечению нескольких файлов. Одно отличие состоит в том, что на этот раз, вам необходимо сначала подставить имя файла и затем, путь для извлечения. Кроме того необходимо использовать метод extract() вместо extractall() . Вот фрагмент кода для извлечения отдельных файлов.

      import zipfile 
      fantasy_zip = zipfile.ZipFile('C:\\Stories\\Fantasy\\archive.zip') 
      fantasy_zip.extract('Fantasy Jungle.pdf', 'C:\\Stories\\Fantasy') 
      fantasy_zip.close() 

      Чтение Архивов

      Рассмотрим сценарий, где вам нужно узнать содержит ли zip-архив конкретный файл. До этого момента, вы могли это сделать только распаковав весь архив. Аналогичным образом, может потребоваться извлечь только те файлы, которые больше, определенного размера. Модуль Zipfile позволяет нам узнать содержимое архива без его распаковки.

      Применение метода namelist() к объекту ZipFile вернет список всех элементов архива по имени. Чтобы получить информацию о конкретном файле в архиве, можно использовать для ZipFile метод getinfo() . Это даст вам доступ к информации об этом файле, такой как, размер сжатого и несжатого файла или информацию о времени его последнего изменения. Мы вернемся к этому позже.

      Вызов метода getinfo() для каждого файла может быть утомительным процессом, когда этих файлов много. В этом случае можно использовать метод infolist() для возврата списка всех элементов, содержащихся в объекте ZipInf. Порядок этих объектов в списке такой же, как и в zip-файлах.

      Вы можете также непосредственно прочитать содержимое определенного файла из архива, с помощью метода read(file) , где file — имя файла, который вы хотите прочесть. Для этого, архив должен быть открыт в режиме чтения или в режиме добавления.

      Чтобы получить размер конкретного сжатого файла из архива, нужно использовать атрибут compress_size . Аналогично чтобы узнать, несжатый размер, можно использовать атрибут file_size .

      Следующий код использует свойства и методы, которые мы только что обсудили, чтобы извлечь только те файлы, размер которых менее 1 МБ.

      import zipfile 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *