zipfile для сжатия и распаковки ZIP-файлов в Python

Бизнес

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

Объясняется следующее содержание.

  • Сжатие нескольких файлов в ZIP-файл
  • Добавление нового файла в существующий ZIP-файл
  • Сжать каталог (папку) в ZIP-файл
  • Сжато в ZIP-файл с паролем
  • Проверьте содержимое ZIP-файла.
  • Извлеките (распакуйте) все содержимое ZIP-файла.
  • Выберите содержимое ZIP-файла и извлеките его.

Сжатие нескольких файлов в ZIP-файл

Создайте объект ZipFile и используйте метод write() для добавления файлов, которые вы хотите сжать.

Чтобы создать новый ZIP-файл, укажите в качестве первого аргумента конструктора объекта ZipFile путь к создаваемому ZIP-файлу, а в качестве второго — следующий аргумент'w'

Кроме того, в качестве третьего аргумента может быть указан метод сжатия.

  • zipfile.ZIP_STORED:Просто объединить несколько файлов без сжатия (по умолчанию)
  • zipfile.ZIP_DEFLATED:Обычное сжатие ZIP (требуется модуль zlib)
  • zipfile.ZIP_BZIP2:Сжатие BZIP2 (требуется модуль bz2)
  • zipfile.ZIP_LZMA:Сжатие LZMA (требуется модуль lzma)

BZIP2 и LZMA имеют более высокий коэффициент сжатия (могут быть сжаты до меньшего размера), но время, необходимое для сжатия, больше.

В методе write() файл с первым аргументом filename записывается в ZIP-файл со вторым аргументом arcname. Если arcname опущен, имя файла используется как есть. arcname может также задавать структуру каталогов.

Объект ZipFile необходимо закрыть методом close(), но если вы используете оператор with, он будет закрыт автоматически по завершении блока.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Указав аргумент compress_type метода write(), можно также выбрать метод сжатия для каждого файла.

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

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

Чтобы добавить новый файл к существующему zip-файлу, при создании объекта ZipFile установите первый аргумент конструктора на путь к существующему zip-файлу. Также задайте режим второго аргумента следующим образом.'a'

Затем, как в примере выше, просто добавьте файл с помощью метода write().

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

Сжать каталог (папку) в ZIP-файл

Если вы хотите сжать целый каталог (папку) в один ZIP-файл, вы можете использовать os.scandir() или os.listdir() для создания списка файлов, но проще использовать make_archive() в модуле shutil.

См. следующую статью.

Сжато в ZIP-файл с паролем

Модуль zipfile не позволяет создавать защищенные паролем ZIP-файлы. Если вы хотите сжать файл в защищенный паролем zip-файл, используйте стороннюю библиотеку pyminizip.

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

Проверьте содержимое ZIP-файла.

Вы можете проверить содержимое существующего ZIP-файла.

Создайте объект ZipFile, задав в конструкторе первым аргументом file путь к существующему zip-файлу, а вторым аргументом mode — 'r'. Аргумент mode может быть опущен, так как по умолчанию используется 'r'.

Вы можете использовать метод namelist() объекта ZipFile, чтобы получить список заархивированных файлов.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

Извлеките (распакуйте) все содержимое ZIP-файла.

Чтобы распаковать содержимое ZIP-файла, создайте объект ZipFile с первым аргументом file в конструкторе в качестве пути к существующему ZIP-файлу и вторым аргументом mode в качестве 'r', как в примере выше. Аргумент mode может быть опущен, поскольку по умолчанию он принимает значение 'r'.

Метод extractall() объекта ZipFile извлекает (распаковывает) все содержимое ZIP-файла. Первый аргумент, path, указывает путь к каталогу, в который будет производиться извлечение. Если он опущен, файлы будут извлечены в текущий каталог.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

ZIP-файл с паролем можно извлечь, указав пароль в качестве аргумента pwd метода extractall().

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

Выберите содержимое ZIP-файла и извлеките его.

Если вы хотите распаковать и извлечь только определенные файлы, используйте метод extract().

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

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

Как и метод extractall(), метод extract() также позволяет указать пароль в качестве аргумента pwd.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')
Copied title and URL