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

Обновлено: 28.06.2024

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

В этом руководстве вы узнаете, как архивировать и распаковывать (распаковывать) zip-файлы с помощью Python!

Начнем!

Оглавление

Предпосылки

Если вы хотите следовать этому руководству, убедитесь, что у вас есть следующее:

Создание Zip-файла с помощью Python

Давайте начнем и сначала сосредоточимся на архивировании файлов с помощью Python. Этот учебник начнется с самого простого метода и будет основываться на различных методах.

Чтобы заархивировать один файл:

<р>1. Откройте ваш любимый текстовый редактор.

<р>2. Если вы хотите точно следовать указаниям руководства, создайте каталог по адресу ~/pythonzipdemo и загрузите в него эти BMP-файлы. Как только вы это сделаете, у вас должно быть четыре растровых файла; all_black.bmp, all_blue.bmp, all_green.bmp и all_red.bmp. У вас также будет скрипт Python demo.py, содержащий весь код из этого руководства.

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

<р>3. Создайте новый скрипт Python с именем demo.py. В этом руководстве демонстрационный сценарий будет сохранен в домашнем каталоге или ~/demo.py.

<р>4. В вашем скрипте Python начните программировать. Сначала импортируйте модуль zipfile. Модуль zipfile — это встроенный модуль Python, который содержит все функции, необходимые для сжатия и распаковки файлов с помощью Python.

<р>5. Затем создайте экземпляр объекта zipfile с помощью метода ZipFile(), откройте zip-файл в режиме записи ( w ), добавьте в него файл, а затем закройте экземпляр ( close() ).

В этом руководстве используются относительные пути. Относительный путь ищет файлы в текущем каталоге, где в данный момент работает Python. Вместо этого вы можете указать абсолютные пути при указании имен файлов.

После запуска сценария вы должны увидеть в папке файл с именем single_file.zip. Поздравляю! Вы заархивировали свой первый файл! Но ждать. Обратите внимание, что он не меньше. По умолчанию ZIP-файл не сжат. Чтобы сжать файлы внутри, необходимо выполнить еще один шаг.

Поскольку zipfile является диспетчером контекста, вы также можете использовать оператор with, например

с ZipFile('single_file.zip', 'w' ) в виде zip-файла: zipfile.write('all_black.bmp')

<р>6. Наконец, добавьте параметр сжатия при создании экземпляра объекта zipfile. Модуль zipfile использует различные атрибуты сжатия, такие как ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2 и ZIP_LZMA, которые определяют, как Python сжимает файлы внутри. По умолчанию для этого атрибута задано значение ZIP_STORED , что означает отсутствие сжатия.

Чтобы сжать файлы внутри архива, необходимо указать атрибут ZIP_DEFLATED, как показано ниже.

Когда вы запустите этот скрипт, вы увидите, что single_file.zip намного меньше, чем фактический растровый файл.

Применение фильтров при сжатии файлов

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

Вы можете фильтровать файлы, с которыми хотите работать, на основе фильтров. Фильтр может быть основан, например, на размере файла или имени файла.

Встроенных способов фильтрации файлов, добавляемых в ZIP-файл, нет. Вам нужно будет создать собственное решение. Один из способов создать собственное решение — создать функцию Python. Функция Python — это набор кода, который вы можете выполнять как единое целое. Создание функции — отличный способ «инкапсулировать» код в один блок.

Функция, которую необходимо создать для этой задачи, будет состоять примерно из четырех отдельных этапов:

  1. Открытие ZIP-файла в режиме записи.
  2. Прочитайте все файлы в исходной папке, из которой вы хотите добавить файлы в ZIP-файл.
  3. Переберите каждый файл и проверьте, соответствует ли он определенной строке.
  4. Если файл соответствует строке, добавьте его в ZIP-файл.

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

Лямбда-выражения в Python используются для создания небольших анонимных функций. Строки не могут быть вызваны, и сделать имя вызываемым; лямбда преобразует имя в функцию.

Список содержимого Zip-файла

После того как вы создали zip-файл, вы также можете использовать Python для чтения файлов внутри. Для этого используйте метод namelist(). Метод namelist() — это удобный способ запросить все файлы в zip-файле, возвращаемом в виде массива имен файлов.

Как показано ниже, основываясь на предыдущем примере, вызовите метод namelist() для объекта zipfile.

Вы увидите, что namelist() возвращает массив всех файлов в zip-архиве. В настоящее время вы увидите только один файл (all_black.bmp) в ZIP-файле.

namelist( ) возвращает массив каждого файла в zip-архиве

namelist() возвращает массив всех файлов в zip-архиве

Если вам нужен более удобочитаемый вывод имен файлов, используйте цикл Python for для чтения каждого имени файла и поместите вкладку в середине каждого, как показано ниже.

Добавление файлов в существующий Zip-файл

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

Чтобы добавить файл в существующий zip-файл, откройте zip-файл в режиме добавления (mode='a'), затем вызовите метод write(), передающий файл для добавления в zip-файл, как показано ниже.< /p>

Извлечение содержимого Zip-файлов с помощью модуля zipfile

Перейдем к извлечению файлов из существующих zip-архивов. Это можно сделать с помощью методов Extract() и Extractall().

В приведенном ниже примере открывается zip-файл для чтения (mode='r'), а затем извлекается один файл (all_blue.bmp) из zip-архива в вашу домашнюю папку. Также демонстрируется использование метода extractall() для извлечения всех файлов из архива в вашу домашнюю папку.

Извлечение содержимого Zip-файлов с помощью модуля Shutil

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

Чтобы извлечь содержимое zip-файлов с помощью модуля Shutil, укажите zip-файл и путь, в который следует извлечь все файлы. В отличие от метода extract() модуля zipfile, метод Shutil unpack_archive() не позволяет выбирать файлы из архива для извлечения.

Применение фильтров при распаковке файлов

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

Результаты запуска последней функции статьи

Результаты запуска последней функции статьи

Заключение

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

Как вы будете интегрировать эти новые знания в свой следующий проект Python?

Ненавидите рекламу? Хотите поддержать писателя? Получите многие из наших руководств в виде руководства по ATA.

Ещё от ATA Learning & Partners

Резервное копирование Office 365 для чайников

Лучшее руководство по защите данных Microsoft Office 365. Изучите готовые функции безопасности.

Руководства ATA

ATA известна своими высококачественными письменными учебными пособиями в виде сообщений в блогах. Поддержите ATA с помощью электронных книг ATA Guidebook PDF, доступных в автономном режиме и без рекламы!

Python позволяет быстро создавать архивы zip/tar.

Следующая команда заархивирует весь каталог

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

Вот шаги для создания Zip-файла в Python

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

Python OS Module, Shell Script Commands

Пояснение кода

  • Импортировать класс make_archive из модуля Shutil
  • Используйте функцию разделения, чтобы отделить каталог и имя файла от пути к местоположению текстового файла (guru99)
  • Затем мы вызываем модуль «shutil.make_archive(«архив guru99, «zip», root_dir)», чтобы создать файл архива, который будет в формате zip.
  • После этого мы передаем корневой каталог вещей, которые хотим заархивировать. Так что все в каталоге будет заархивировано
  • Запустив код, вы увидите, что в правой части панели создается ZIP-файл архива.

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

Python OS Module, Shell Script Commands

Теперь ваш файл archive.zip появится в вашей операционной системе (проводник Windows)

Python OS Module, Shell Script Commands

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

Python OS Module, Shell Script Commands

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

Python OS Module, Shell Script Commands

Пояснение кода

  • Импортировать класс Zipfile из модуля Python zip-файла. Этот модуль дает полный контроль над созданием zip-файлов.
  • Мы создаем новый Zip-файл с именем («testguru99.zip, «w»)
  • Для создания нового класса Zipfile требуется передать разрешение, поскольку это файл, поэтому вам нужно записать информацию в файл как newzip
  • Мы использовали переменную «newzip» для ссылки на созданный нами ZIP-файл.
  • С помощью функции записи в переменную «newzip» добавляем в архив файлы «guru99.txt» и «guru99.txt.bak».

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

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

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

Python OS Module, Shell Script Commands

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

В этой статье объясняется, как можно выполнять различные операции с zip-файлом с помощью простой программы на Python.

Что такое ZIP-файл?

ZIP – это формат файла архива, который поддерживает сжатие данных без потерь. Под сжатием без потерь мы подразумеваем, что алгоритм сжатия позволяет полностью восстановить исходные данные из сжатых данных. Таким образом, ZIP-файл – это отдельный файл, содержащий один или несколько сжатых файлов. Это идеальный способ уменьшить размер больших файлов и сохранить связанные файлы вместе.

  • Чтобы уменьшить требования к хранилищу.
  • Для повышения скорости передачи по сравнению со стандартными подключениями.

Для работы с zip-файлами с помощью Python мы будем использовать встроенный модуль Python под названием zipfile.

<р>1. Извлечение ZIP-файла

Приведенная выше программа извлекает zip-файл с именем «my_python_files.zip» в тот же каталог, что и этот скрипт Python.
Вывод вышеуказанной программы может выглядеть следующим образом:


ZipFile — это класс модуля zipfile для чтения и записи zip-файлов. Здесь мы импортируем только класс ZipFile из модуля zipfile.

Здесь объект ZipFile создается путем вызова конструктора ZipFile, который принимает параметры имени и режима zip-файла. Мы создаем объект ZipFile в режиме READ и называем его zip.

Метод printdir() печатает оглавление архива.

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

При этом будет извлечен только указанный файл.

<р>2. Запись в ZIP-файл

Рассмотрите каталог (папку) в таком формате:


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

Если вы найдете эту информацию полезной, рассмотрите возможность приобретения экземпляра моей книги Стандартная библиотека Python на примере.

Содержание страницы

Навигация

Эта страница

Примеры

Вывод всех примеров программ из PyMOTW был сгенерирован с помощью Python 2.7.8, если не указано иное. Некоторые из описанных здесь функций могут быть недоступны в более ранних версиях Python.

Если вы ищете примеры, которые работают в Python 3, обратитесь к разделу сайта PyMOTW-3.

Навигация

Назначение:Чтение и запись ZIP-архивов.
Доступно в:1.6 и выше

Модуль zipfile можно использовать для управления ZIP-архивами.

Ограничения¶

Модуль zipfile не поддерживает ZIP-файлы с добавленными комментариями или многодисковые ZIP-файлы. Он поддерживает ZIP-файлы размером более 4 ГБ, использующие расширения ZIP64.

Тестирование ZIP-файлов¶

Функция is_zipfile() возвращает логическое значение, указывающее, относится ли имя файла, переданное в качестве аргумента, к действительному ZIP-файлу.

Обратите внимание, что если файл вообще не существует, is_zipfile() возвращает False.

Чтение метаданных из ZIP-архива¶

Используйте класс ZipFile для работы непосредственно с ZIP-архивом. Он поддерживает методы чтения данных о существующих архивах, а также изменения архивов путем добавления дополнительных файлов.

Чтобы прочитать имена файлов в существующем архиве, используйте namelist() :

Возвращаемое значение представляет собой список строк с именами содержимого архива:

Однако список имен — это только часть информации, доступной в архиве. Чтобы получить доступ ко всем метаданным о содержимом ZIP, используйте методы infolist() или getinfo().

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

Если вам заранее известно имя элемента архива, вы можете получить его объект ZipInfo с помощью getinfo() .

Если элемент архива отсутствует, getinfo() вызывает KeyError.

Извлечение заархивированных файлов из ZIP-архива¶

Чтобы получить доступ к данным из элемента архива, используйте метод read(), передав имя элемента.

При необходимости данные автоматически распаковываются для вас.

Создание новых архивов¶

Чтобы создать новый архив, просто создайте экземпляр ZipFile с режимом 'w' . Любой существующий файл усекается и запускается новый архив. Чтобы добавить файлы, используйте метод write().

По умолчанию содержимое архива не сжато:

Для добавления сжатия требуется модуль zlib. Если zlib доступен, вы можете установить режим сжатия для отдельных файлов или для архива в целом, используя zipfile.ZIP_DEFLATED . Режим сжатия по умолчанию: zipfile.ZIP_STORED .

На этот раз элемент архива сжат:

Использование альтернативных имен членов архива¶

Легко добавить файл в архив, используя имя, отличное от исходного имени файла, передав аргумент arcname в write() .

В архиве нет признаков исходного имени файла:

Запись данных из источников, отличных от файлов¶

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

В этом случае я использовал аргумент сжатия для ZipFile для сжатия данных, поскольку writestr() не принимает сжатие в качестве аргумента.

Эти данные не существовали в файле до добавления в ZIP-файл

Запись с использованием экземпляра ZipInfo¶

Обычно дата модификации рассчитывается для вас, когда вы добавляете файл или строку в архив. При использовании writestr() вы также можете передать экземпляр ZipInfo, чтобы самостоятельно определить дату модификации и другие метаданные.

В этом примере я устанавливаю время изменения равным текущему времени, сжимаю данные, задаю значение false для create_system и добавляю комментарий.

Добавление к файлам¶

Помимо создания новых архивов, можно добавить их к существующему архиву или добавить архив в конец существующего файла (например, файла .exe для самораспаковывающегося архива). Чтобы открыть файл для добавления к нему, используйте режим 'a' .

Результирующий архив заканчивается двумя элементами:

ZIP-архивы Python¶

Начиная с версии 2.3, Python имеет возможность импортировать модули из ZIP-архивов, если эти архивы появляются в sys.path.Класс PyZipFile можно использовать для создания модуля, пригодного для использования таким образом. Когда вы используете дополнительный метод writepy() , PyZipFile сканирует каталог на наличие файлов .py и добавляет соответствующий файл .pyo или .pyc в архив. Если ни одна из скомпилированных форм не существует, создается и добавляется файл .pyc.

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

zipfile Документация стандартной библиотеки для этого модуля. zlib Библиотека сжатия ZIP tarfile Чтение и запись архивов tar zipimport Импорт модулей Python из ZIP-архива. Примечание по применению PKZIP Официальная спецификация формата ZIP-архива.

Навигация

© Авторские права Дуг Хеллманн. | | Последнее обновление: 11 июля 2020 г. | Создано с помощью Sphinx. | Дизайн на основе "Листьев" от SmallPark |

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