Python добавить файл в архив

Обновлено: 03.07.2024

Создание файлов и директорий
Каким способом можно создать новый файл и директорию? Набег на документацию нужных методов не.

Создание резервных копий файлов
Здравствуйте. Читаю Byte of Python. Застрял на моменте с созданием резервных копий файлов(т.е. с.

Создание и добавление файлов в архив
Подскажите как реализовать возможность добавления в архив файлов? У меня Web Site. .

Добавление файлов непосредственно в архив zip, минуя их промежуточное создание
Здравствуйте, допустим существует определённое количество папок, с разного рода данными (txt, Jpeg.

Автор прав. Воды в нете полно. По делу - информации ноль. Нечему улыбаться. Тут забавно, что во 1 вы не умеете искать, а во 2 написав простенький шаблонный скрипт выкладываете его как священный гроаль и думаете, что это круто (а на деле такого добра навалом в сети). alex925, в самую точку! тем более что это чистая копия взятая отсюда стр 91-92 Вы смешные. В сети полно документации, но учатся ребята программировать на живом коде. Так вот, я нашел только этот пример в индексе гугла. Больше нигде ничего нет. Если вы писанину по классам и маны называете "граалем", то это просто смешно.

Ок. Но я вот, например, вынужден использовать для записи байтовый объект и вместо функции .write(), приходится обходиться .writestr(). И знаете в чем проблема? Нигде нет примера того, как задать способ сжатия при такой записи. Абсолютно нигде, даже на офф-сайте Python (в документации по библиотеке zipfile).

Т.е. в манах написано: задается так и так - без примера кода. Я задаю. Результат - исключение.
Когда же этот аргумент функции не передаю - сжатие составляет 0 % (по умолчанию).

И хоть убейте - не знаю что делать именно в этой библиотеке. Облазил весь интернет, но напоролся только на эту тему. Да, на англоязычных ресурсах точно такие же темы есть и их много, конечно, но они не всесторонние и касаются лишь самой малой части функционала библиотеки. Не знаю, короче. Я написал в эту тему, потому что считаю решение автора написать о своем вопросе более адекватным, чем может показаться на первый взгляд, так как источников информации много, но она по сути не является иной информацией, а лишь очередной интерпретацией тех же вопросов: как создать тот или иной объект; как задать рекурсию тут и там и т.п. Короче, разнообразия и всесторонности в этой "в сети куча информации" просто нет. Одно и то же повсюду.

За что я люблю питон, так это за его богатую стандартную библиотеку, в которой найдется модуль для любой задачи, в разы упрощающей работу программиста. Для работы с zip архивами существует модуль zipfile. Про него и будет дальнейший рассказ. Для начала сделаем импорт всех функций и классов данного модуля. Пишем:

Итак, первое с чего я начну - это с проверки файла на принадлежность к архиву. Создадим руками zip архив, назовем его «123.zip», внутрь вы можете положить все, что угодно и выполним команду проверки:

Как несложно догадаться, эта функция проверяет, является ли файл архивом или нет. Если да, то она вернет True, если нет False. В аргументе она принимает только имя файла и не более этого. Идем дальше. Следующим, что мы рассмотрим, будет класс ZipFile. Он имеет следующий синтаксис:

, где filename - имя файла zip архива, в mode передается флаг. Вы можете передать в него следующие флаги: 'r' - файл будет открыт для чтения. 'w' - если файл существует, то он будет уничтожен и вместо него будет создан новый файл. 'a' - существующий файл будет открыт в режиме добавления в конец.

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

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

Теперь извлечем из него что-нибудь. В моем случае, внутри архива лежит пустой текстовый файл с именем text.

Вы также можете передать вторым аргументом строку path, которая укажет куда извлечь данный файл, и если ваш архив закрыт паролем, то третим аргументом вы можете передать значения пароля.

Но иногда нам требуется сразу извлечь все файлы из архива. Для этого есть замечательный метод extractall(), синтаксис которого схож с методом extract, но определяет некоторые свои аргументы. Первым в нем стоит аргумент path, который описан выше, второй members (о нем ниже) и третий - это pwd, то есть пароль на архив.

По поводу members - это подмножество списка, возвращаемого методом namelist(). Этот метод возвращает список имен элементов архива, не больше не меньше. Идем дальше.

Теперь откроем файл для чтения в архиве. Для этого есть метод open(). Он принимает имя файла в архиве и может открывать только для чтения. Вторым аргументов выступает флаг. Их несколько: 'r', 'rU' или 'U'. Последним аргументом может передаваться пароль. Обратите внимание, метод возвращает объект, который поддерживает методы read(), readline() и readlines(), а также позволяет выполнять итерации с помощью for.

Теперь выведем каталог архива в поток sys.stdout.

Чтобы добавить файл в архив, существует метод write(). Он имеет синтаксис: write(filename, [, arcname[, compress_type]]), где filename - имя файла, arcname - имя в архиве, compress_type - метод сжатия. Он принмает те же значения, что и ZipFile(), описанный выше. Обратите внтмание, что по умолчанию используется метод сжатия, указанный в вызове ZipFile(). Архив должен быть открыт в режиме 'w' или 'a'.

И последний метод, который я рассмотрю - это close(). Он, как не сложно догадаться закрывает файл архива. Помните, что он должен вызываться перед завершением программы для того, чтобы «вытолкнуть» в zip файл оставшиеся в памяти записи.

Об остальных функциях и классах модуля zipfile вы можете прочитать в официальной документации по языку Python. Спасибо за внимание!

Если вы пользовались компьютером хоть немного, то возможно вам встречались файлы с расширением .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, позволяет вам гибко использовать сжатие файлов. Вы можете архивировать файлы в директории в различные архивы в зависимости от их типа, имени и размера. Вы так же можете решать оставлять вам структуру директории или нет. Аналогично при извлечении файлов, вы можете извлекать их куда вам нужно, на основе собственных критериев, таких как размер, и т.д.

Если честно, мне было очень интересно архивировать и извлекать файлы пока я писал свой код. Я надеюсь урок был вам полезен, и если у вас остались какие-то вопросы, пишите их пожалуйста в комментариях.

Следующая команда дает контроль над файлами, которые вы хотите заархивировать.


Бесплатный курс «Python. Быстрый старт»

Получите курс и узнайте, как создать программу для перевода текстов на Python

Вот последовательность создания Zip-файла в Python.

Шаг 1) Чтобы создать архивный файл, убедитесь, что вы правильно указали оператор импорта. Здесь оператор импорта для архива from shutil import make_archive


Импортируем класс make_archive из модуля shutil

Используйте функцию split, чтобы разделить каталог и имя файла из пути к местоположению текстового файла (guru99)

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

Когда вы запустите код, вы увидите, что архивный zip-файл с правой стороны панели.

Шаг 2) Когда архивный файл создан, вы можете кликнуть правой кнопкой мыши на файле и выбрать ОС, это покажет содержащиеся файлы.


Теперь файл archive.zip появится в ОС (Windows Explorer).


Шаг 3) Когда вы дважды кликните на архиве, вы увидите список всех файлов в нем.


Шаг 4) В Python мы можем лучше контролировать архив, так как мы можем определить, какой конкретный файл включить в него. В нашем случае мы включим два файла «guru99.txt» и «guru99.txt.bak».


Бесплатный курс «Python. Быстрый старт»

Получите курс и узнайте, как создать программу для перевода текстов на Python


Импортируем класс Zipfile из модуля Python. Этот модуль дает полный контроль над созданием ZIP-файлов

Для создания нового класса Zipfile, требуется передать доступы, потому что это файл, поэтому вам нужно записать информацию в файл как newzip

Используя функцию записи для переменной «newzip», мы добавляем файлы «guru99.txt» и «guru99.txt.bak» в архив.

Когда вы выполните код, вы увидите, что файл создан в правой стороне панели с именем «guru99.zip».

Примечание. Здесь мы не выполняем команду «close» файл, например «newzip.close», потому что используем блокировку области действия «С», поэтому, когда программа выходит за пределы этой области, файл будет очищен и автоматически закрыт.

Шаг 5) Когда вы -> кликните правой кнопкой мыши на файле (testguru99.zip) и -> выберите свою ОС (Windows Explorer) , будут показаны архивные файлы в папке.


Если дважды кликнуть файл «testguru99.zip», откроется другое окно, в котором будут показаны файлы, включенные в него.

Читайте также: