Модулът zipfile на стандартната библиотека на Python може да се използва за компресиране на файлове в ZIP и за разкомпресиране на ZIP файлове. Той е включен в стандартната библиотека, така че не е необходима допълнителна инсталация.
Обяснено е следното съдържание.
- Компресиране на няколко файла в ZIP файл
- Добавяне на нов файл към съществуващ ZIP файл
- Компресиране на директория (папка) в ZIP файл
- Компресиран в ZIP файл с парола
- Проверете съдържанието на ZIP файла.
- Изтеглете (разопаковайте) цялото съдържание на 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 файл, задайте първия аргумент на конструктора като пътя на съществуващия zip файл при създаването на обекта ZipFile. Също така задайте режима на втория аргумент, както следва.'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 или tar в Python
Компресиран в 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 файла. Първият аргумент, път, указва пътя до директорията, в която да се извлече. Ако той е пропуснат, файловете ще бъдат извлечени в текущата директория.
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')