zipfile для стиснення та розпакування ZIP-файлів у Python

Бізнес

Модуль zipfile стандартної бібліотеки Python можна використовувати для стиснення файлів у ZIP-файли та розпакування ZIP-файлів. Він входить до стандартної бібліотеки, тому додаткової установки не потрібно.

Пояснюється наступний зміст.

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

Стисніть декілька файлів у файл ZIP

Створіть об’єкт ZipFile і використовуйте метод write(), щоб додати файли, які потрібно стиснути.

Щоб створити новий ZIP-файл, укажіть шлях до ZIP-файлу, який буде створено, як перший аргумент конструктора об’єкта ZipFile, а другий аргумент: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, встановивши для першого файлу аргументів у конструкторі шлях до існуючого zip-файлу, а для режиму другого аргументу — «r». Аргумент режиму можна опустити, оскільки за замовчуванням є ‘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 з першим файлом аргументів у конструкторі як шлях до існуючого ZIP-файлу та режимом другого аргументу як ‘r’, як у прикладі вище. Аргумент режиму можна опустити, оскільки він за замовчуванням має значення «r».

Метод extractall() об’єкта ZipFile витягує (розтискає) весь вміст ZIP-файлу. Перший аргумент, шлях, вказує шлях до каталогу для вилучення. Якщо його опустити, файли буде розпаковано до поточного каталогу.

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() є ім’я файлу, який потрібно витягнути, а другий аргумент – це шлях до каталогу, до якого потрібно витягнути. Якщо аргумент шляху опущено, файл буде розпаковано до поточного каталогу. Ім’я файлу, який потрібно розпакувати, має містити шлях до каталогу в 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')