- Модуль zipfile в Python, работа с zip архивами.
- Примеры использования:
- Объект ZipFile модуля zipfile в Python.
- Использование объекта ZipFile с описанием.
- Содержание:
- ZipFile.close() :
- ZipFile.getinfo(name) :
- ZipFile.infolist() :
- ZipFile.namelist() :
- ZipFile.open(name, mode=’r’, pwd=None, *, force_zip64=False) :
- ZipFile.extract(member, path=None, pwd=None) :
- ZipFile.extractall(path=None, members=None, pwd=None) :
- ZipFile.printdir() :
- ZipFile.setpassword(pwd) :
- ZipFile.read(name, pwd=None) :
- ZipFile.testzip() :
- ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None) :
- ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None) :
- №38 Функция zip() / для начинающих
- Обновление итератора Python
- Пример работы функция zip() в Python
- Сжатие и Разархивирование Файлов c Помощью Python
- Сжатие Одиночных Файлов
- Сжатие Нескольких Файлов
- Извлечение Всех Файлов
- Извлечение Единичных Файлов
- Чтение Архивов
- Заключительные мысли
Модуль zipfile в Python, работа с zip архивами.
Формат файла ZIP является стандартным архивом и стандартом сжатия. Этот модуль предоставляет инструменты для создания, чтения, записи, добавления и вывода списка файлов ZIP. Любое расширенное использование этого модуля потребует понимания формата, как определено в Замечании по применению PKZIP.
Модуль zipfile в настоящее время не обрабатывает многодисковые ZIP-файлы. Он может обрабатывать ZIP-файлы, которые используют расширения .zip64 , то есть ZIP-файлы размером более 4 ГиБ. Он поддерживает дешифрование зашифрованных файлов в ZIP-архивах, но в настоящее время не может создать зашифрованный файл. Расшифровка очень медленная, так как она реализована на родном Python, а не на C.
Примечание. Спецификация формата файлов ZIP включает поддержку сжатия BZIP2 с 2001 года и сжатия LZMA с 2006 года. Однако некоторые инструменты, включая более старые выпуски Python не поддерживают эти методы сжатия и могут либо вообще отказаться от обработки файла ZIP, или не получиться извлечь какие то отдельные файлы.
Примеры использования:
Создание архива каталога. Для рекурсивного добавления файлов в архив вместо функции os.listdir() для создания списка файлов используйте функцию glob.glob() с аргументом recursive=True .
Для добавления файлов необходимо существующий архив открыть на добавление с параметром mode=’а’ . добавим уже существующий в архиве файл, только под другим именем.
Список файлов в архиве.
Подробная информация о файлах в архиве.
Извлечение всех файлов из архива в определенный каталог.
Извлечение определенных файлов из архива в каталог.
Объект ZipFile модуля zipfile в Python.
Использование объекта ZipFile с описанием.
В данном разделе рассмотрены методы объекта ZipFile с их подробным описанием и примерами. Объект ZipFile получается в результате создания экземпляра класса ‘zipfile.ZipFile()’.
Содержание:
- Закрыть файл архива ZipFile.close() ,
- Получить zipfile.ZipInfo() для определенного файла ZipFile.getinfo() ,
- Список объектов zipfile.ZipInfo() для всех файлов архива ZipFile.infolist() ,
- Список файлов архива по имени ZipFile.namelist() ,
- Открыть файл в архиве в бинарном режиме ZipFile.open() ,
- Извлечь файл из архива ZipFile.extract() ,
- Извлечь все файлы архива ZipFile.extractall() ,
- Оглавление архива ZipFile.printdir() ,
- Установить пароль архива ZipFile.setpassword() ,
- Прочитать файл в виде байтов ZipFile.read() ,
- Проверить целостность архива ZipFile.testzip() ,
- Добавить файл в архив ZipFile.write() ,
- Записать файл в архив ZipFile.writestr() ,
- Получить имя открытого архива ZipFile.filename ,
- Установить уровень вывода отладочной информации ZipFile.debug ,
- Установить/получить комментарий к архиву ZipFile.comment ,
ZipFile.close() :
Метод ZipFile.close() закрывает файл архива. Необходимо вызвать этот метод перед выходом из программы, иначе не вся информация будет записана или используйте менеджер контекста.
ZipFile.getinfo(name) :
Метод ZipFile.getinfo() возвращает объект zipfile.ZipInfo() с информацией для элемента архива с именем name .
Вызов метода ZipFile.getinfo() для несуществующего имени элемента архива вызовет исключение KeyError .
ZipFile.infolist() :
Метод ZipFile.infolist() возвращает список, содержащий объект zipfile.ZipInfo() для каждого члена архива.
Объекты находятся в том же порядке, что и в реальном ZIP-файле на диске.
ZipFile.namelist() :
Метод ZipFile.namelist() возвращает список членов архива по имени.
ZipFile.open(name, mode=’r’, pwd=None, *, force_zip64=False) :
Метод ZipFile.open() предоставляет доступ к элементу архива в виде двоичного файлового объекта.
- Аргумент name может быть либо именем файла в архиве, либо объектом zipfile.ZipInfo() .
- Аргумент mode , если он включен, должен иметь значение ‘r’ (по умолчанию) или ‘w’ .
- Аргумент pwd — это пароль, используемый для расшифровки зашифрованных ZIP-файлов.
Метод ZipFile.open() является менеджером контекста и поэтому поддерживает оператор with :
В режиме mode=’r’ файлоподобный объект ZipExtFile доступен только для чтения и предоставляет следующие методы: read() , readline() , readlines() , seek() , tell() , __iter__() , __next__() . Эти объекты могут работать независимо от объекта ZipFile`.
В режиме mode=’w’ возвращается дескриптор доступного для записи файла, который поддерживает метод write() . Когда дескриптор доступного для записи файла открыт, попытка чтения или записи других файлов в ZIP-архиве вызовет ошибку ValueError .
При записи файла, если размер файла заранее неизвестен, но может превышать 2 ГБ, то передайте force_zip64=True для поддержки больших файлов. Если размер файла известен заранее, то создавайте объект zipfile.ZipInfo() с установленным аргументом file_size и используйте его в качестве параметра имени.
Примечание.
Методы ZipFile.open() , ZipFile.read() и ZipFile.extract() могут принимать в качестве имени файла объект zipfile.ZipInfo() . Вы оцените это при попытке прочитать ZIP-файл, содержащий элементы архива с повторяющимися именами.
ZipFile.extract(member, path=None, pwd=None) :
Метод ZipFile.extract() извлекает элемент архива member в текущий рабочий каталог.
- Аргумент member должен быть полным именем или объектом zipfile.ZipInfo() . Информация о его файле извлекается максимально точно.
- Аргумент пути path указывает другой каталог для извлечения.
- Аргумент pwd — пароль, используемый для зашифрованных файлов.
Метод ZipFile.extract() возвращает созданный нормализованный путь (каталог или новый файл).
Примечание.
Если имя файла архива является абсолютным путем, разделяющая точка диска drive/UNC и начальная (обратная) косая черта будут удалены, например: ////foo/bar становится foo/bar в Unix, а C:\foo\bar становится foo\bar в Windows. И все компоненты ‘..’ в имени файла элемента архива будут удалены, например: ../../foo../../ba..r становится foo../ba..r . В Windows недопустимые символы : , , > , | , » , ? и * заменяются подчеркиванием _ .
ZipFile.extractall(path=None, members=None, pwd=None) :
Метод ZipFile.extractall() извлекает все элементы архива в текущий рабочий каталог.
- Аргумент пути path указывает другой каталог для извлечения.
- Аргумент members не обязателен и должен быть подмножеством списка, возвращаемого методом ZipFile.namelist() .
- Аргумент pwd — пароль, используемый для зашифрованных файлов.
Предупреждение.
Никогда не извлекайте архивы из ненадежных источников без предварительной проверки. Имена файлов или каталогов внутри архива архива могут иметь абсолютные имена файлов, начинающиеся с ‘/’ или имена файлов с двумя точками ‘..’ . Модуль zipfile будет пытается исправить это. Смотрите примечание метода ZipFile.extract() .
ZipFile.printdir() :
Метод ZipFile.printdir() печатает оглавление архива в sys.stdout .
ZipFile.setpassword(pwd) :
Метод ZipFile.setpassword() устанавливает pwd в качестве пароля по умолчанию для извлечения зашифрованных файлов.
ZipFile.read(name, pwd=None) :
Метод ZipFile.read() возвращает байты прочитанный из файла в архиве с именем name .
- Аргумент name — строка с полным именем файла в архиве или объект zipfile.ZipInfo() . Архив должен быть открыт для чтения или добавления.
- Аргумент pwd — это пароль, используемый для зашифрованных файлов и если он указан, он переопределит пароль по умолчанию, установленный с помощью метода ZipFile.setpassword() .
Вызов ZipFile.read() для экземпляра класса zipfile.ZipFile , который использует метод сжатия, отличный от ZIP_STORED , ZIP_DEFLATED , ZIP_BZIP2 или ZIP_LZMA , вызовет исключение NotImplementedError . Также будет возникать ошибка, если соответствующий модуль сжатия недоступен.
ZipFile.testzip() :
Метод ZipFile.testzip() читает все файлы в архиве и проверяет их CRC и заголовки файлов. Возвращает имя первого неверного/битого файла или если все «путем», то возвращает None .
ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None) :
Метод ZipFile.write() добавляет файл с именем filename в архив, присвоив ему имя в архиве arcname , по умолчанию это будет то же самое, что и filename , но без буквы диска и с удаленными начальными разделителями пути.
Если задан аргумент compress_type , то он переопределяет значение этого параметра, заданное при создании экземпляра класса zipfile.ZipFile для добавления в архив нового элемента. Аналогично, если задан аргумент compresslevel , то он переопределит конструктор. Архив должен быть открыт в режиме ‘w’ , ‘x’ или ‘a’ .
Примечания:
- Имена архивов должны относиться к корню архива, то есть они не должны начинаться с разделителя пути.
- Если arcname или имя файла, если arcname не указано содержит нулевой байт, имя файла в архиве будет обрезано до нулевого байта.`
ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None) :
Метод ZipFile.writestr() записывает файл в архив.
Аргумент data это данные (содержимое) файла, которые могут быть str или bytes . Если данные представляют из себя строки str , то они сначала кодируется как UTF-8.
Аргумент zinfo_or_arcname — это либо имя файла, которое будет дано в архиве, либо объект ZipInfo . Если это объект ZipInfo , то необходимо указать аргумент data . Если это имя файла, то дата и время устанавливаются на текущую дату и время. Архив должен быть открыт в режиме ‘w’ , ‘x’ или ‘a’ .
№38 Функция zip() / для начинающих
Функция zip() в Python создает итератор, который объединяет элементы из нескольких источников данных. Эта функция работает со списками, кортежами, множествами и словарями для создания списков или кортежей, включающих все эти данные.
В Python есть несколько встроенных функций, которые позволяют перебирать данные. Одна из них — zip. Функция zip() в Python создает итератор, который объединяет элементы из нескольких источников данных.
У функции zip() множество сценариев применения. Например, она пригодится, если нужно создать набор словарей из двух массивов, каждый из которых содержит имя и номер сотрудника.
В этом материале разберемся с основами этой функции, познакомимся с отличиями в Python 2 и Python 3, а также узнаем, в каких ситуациях zip() может быть полезна.
Обновление итератора Python
В Python итерация — это процесс прохождения программы по списку. Например, если есть цикл for, который выводит название каждой сферы, которой занимается компания, можно сказать, что программа выполняет итерацию (перебирает) списка названий.
Итерируемый объект же — это объект, который может возвращать отдельные элементы. Таким образом массивы — это итерируемые объекты, потому что можно вывести каждый отдельный элемент с помощью цикла for. Основы итерации в Python вспомнили — теперь можно переходить и к функции zip() .
Пример работы функция zip() в Python
Функция zip() принимает итерируемый объект, например, список, кортеж, множество или словарь в качестве аргумента. Затем она генерирует список кортежей, которые содержат элементы из каждого объекта, переданного в функцию.
Предположим, что есть список имен и номером сотрудников, и их нужно объединить в массив кортежей. Для этого можно использовать функцию zip() . Вот пример программы, которая делает именно это:
Сжатие и Разархивирование Файлов c Помощью Python
Russian (Pусский) translation by Andrey Rybin (you can also view the original English article)
Если вы пользовались компьютером хоть немного, то возможно вам встречались файлы с расширением .zip. Это специальные файлы в которые могут содержать в сжатом состоянии большое количество других файлов, директорий и поддиректорий. Это делает их очень удобными для передачи данных через интернет. А знаете ли вы, что вы можете использовать Python для сжатия и распаковки архивов?
В этом уроке вы научитесь как использовать библиотеку zipfile, чтобы извлекать или упаковывать один или сразу несколько файлов в архив.
Сжатие Одиночных Файлов
Это очень просто, и потребует написать совсем немного кода. Начинаем с того, что импортируем модуль zipfile и затем инициируем объект ZipFile с возможностью записи, указав это с помощью второго параметра ‘w’. Первый параметр, это путь к файлу. Вот код, который нам нужен:
Пожалуйста, обратите внимание, что я буду указывать путь во всех фрагментах кода в формате для Windows; если вы работаете на Linux или Mac, вам нужно будет внести соответствующие изменения.
Вы можете указать различные методы сжатия, что бы заархивировать файл. В Python версии 3.3 были добавлены новые методы BZIP2 и LZMA , а также некоторые другие инструменты, которые не поддерживают эти два метода сжатия. По этой причине безопасно использовать метод DEFLATED . Но вам все же стоит попробовать эти методы, что бы увидеть разницу в размерах сжатого файла.
Сжатие Нескольких Файлов
Это будет чуть сложнее, так как вы должны выполнить итерационный процесс для всех файлов. Код показанный ниже должен заархивировать все файлы в директории с расширением pdf.
На этот раз нам необходимо импортировать модуль os и использовать метод walk() , чтобы пробежаться про всем файлам и поддиректориям в нашей основной директории. Я архивирую только файлы с расширением pdf. Вы так же можете создавать различные архивные файлы для разных форматов файлов используя оператор if .
Если вы не хотите, сохранить структуру каталога, вы можете положить все файлы вместе, используя следующую строку:
Метод write() допускает три параметра. Первый параметр — это имя нашего файла, который мы хотим сжать. Второй параметр не обязательный, он позволяет вам указать другое имя для файла архива. Если ничего не указано, будет использоваться имя архивируемого файла.
Извлечение Всех Файлов
Вы можете использовать метод extractall() для извлечения всех файлов и папок из zip-файла в текущую рабочую директорию. Вы можете также указать имя папки в extractall() для извлечения всех файлов и директорий в заданный каталог. Если директория, которую вы указали не существует, метод сам создаст новую. Вот код, который вы можете использовать для извлечения файлов:
Если вы хотите распаковать несколько файлов, вам необходимо подставить имена этих файлов в виде списка.
Извлечение Единичных Файлов
Это подобно извлечению нескольких файлов. Одно отличие состоит в том, что на этот раз, вам необходимо сначала подставить имя файла и затем, путь для извлечения. Кроме того необходимо использовать метод extract() вместо extractall() . Вот фрагмент кода для извлечения отдельных файлов.
Чтение Архивов
Рассмотрим сценарий, где вам нужно узнать содержит ли zip-архив конкретный файл. До этого момента, вы могли это сделать только распаковав весь архив. Аналогичным образом, может потребоваться извлечь только те файлы, которые больше, определенного размера. Модуль Zipfile позволяет нам узнать содержимое архива без его распаковки.
Применение метода namelist() к объекту ZipFile вернет список всех элементов архива по имени. Чтобы получить информацию о конкретном файле в архиве, можно использовать для ZipFile метод getinfo() . Это даст вам доступ к информации об этом файле, такой как, размер сжатого и несжатого файла или информацию о времени его последнего изменения. Мы вернемся к этому позже.
Вызов метода getinfo() для каждого файла может быть утомительным процессом, когда этих файлов много. В этом случае можно использовать метод infolist() для возврата списка всех элементов, содержащихся в объекте ZipInf. Порядок этих объектов в списке такой же, как и в zip-файлах.
Вы можете также непосредственно прочитать содержимое определенного файла из архива, с помощью метода read(file) , где file — имя файла, который вы хотите прочесть. Для этого, архив должен быть открыт в режиме чтения или в режиме добавления.
Чтобы получить размер конкретного сжатого файла из архива, нужно использовать атрибут compress_size . Аналогично чтобы узнать, несжатый размер, можно использовать атрибут file_size .
Следующий код использует свойства и методы, которые мы только что обсудили, чтобы извлечь только те файлы, размер которых менее 1 МБ.
Чтобы узнать время и дату последнего изменения определенного файла из архива, можно использовать атрибут date_time . Это возвращает кортеж из шести величин. Этими величинами будут год, месяц, день месяца, часы, минуты и секунды, в установленном порядке. Год будет всегда больше или равен 1980 года и часы, минуты и секунды от нуля.
Информация об оригинальном размере файла и размере сжатого файла может помочь вам увидеть, принесло ли архивирование пользу. Я думаю, это может быть так же использовано и в других случаях.
Заключительные мысли
Как видно из этого урока, использование модуля zipfile, позволяет вам гибко использовать сжатие файлов. Вы можете архивировать файлы в директории в различные архивы в зависимости от их типа, имени и размера. Вы так же можете решать оставлять вам структуру директории или нет. Аналогично при извлечении файлов, вы можете извлекать их куда вам нужно, на основе собственных критериев, таких как размер, и т.д.
Если честно, мне было очень интересно архивировать и извлекать файлы пока я писал свой код. Я надеюсь урок был вам полезен, и если у вас остались какие-то вопросы, пишите их пожалуйста в комментариях.