Модуль 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() файл з першым аргументам імя файла запісваецца ў ZIP-файл з другім аргументам імя дугі. Калі 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, усталяваўшы для першага файла аргументаў у канструктары шлях да існуючага zip-файла, а для рэжыму другога аргументу – “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 з першым файлам аргументаў у канструктары ў якасці шляху да існуючага файла ZIP, а другім рэжымам аргументу – ‘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() – гэта імя файла для выманне, а другі аргумент – гэта шлях да каталога, у які трэба выняць. Калі аргумент шляху апушчаны, файл будзе выняты ў бягучы каталог. Імя файла, які трэба выняць, павінна ўключаць шлях да каталога ў 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')