zipfile upang i-compress at i-uncompress ang mga ZIP file sa Python

Negosyo

Ang zipfile module ng Python standard library ay maaaring gamitin upang i-compress ang mga file sa mga ZIP at i-uncompress ang ZIP file. Ito ay kasama sa karaniwang aklatan, kaya walang karagdagang pag-install ang kinakailangan.

Ang mga sumusunod na nilalaman ay ipinaliwanag.

  • I-compress ang maramihang mga file sa isang ZIP file
  • Magdagdag ng bagong file sa isang kasalukuyang ZIP file
  • I-compress ang isang direktoryo (folder) sa isang ZIP file
  • Na-compress sa isang ZIP file na may password
  • Suriin ang mga nilalaman ng ZIP file.
  • I-extract (i-unpack) ang buong nilalaman ng ZIP file.
  • Piliin ang mga nilalaman ng ZIP file at i-extract ito.

I-compress ang maramihang mga file sa isang ZIP file

Gumawa ng ZipFile object at gamitin ang write() na paraan upang idagdag ang mga file na gusto mong i-compress.

Upang lumikha ng isang bagong ZIP file, tukuyin ang landas ng ZIP file na gagawin bilang ang unang argumento ng constructor ng ZipFile object, at ang pangalawang argumento bilang mga sumusunodw'

Bilang karagdagan, ang paraan ng compression ay maaaring tukuyin bilang ang ikatlong argumento.

  • zipfile.ZIP_STORED:Pagsamahin lang ang maramihang mga file nang walang compression (default)
  • zipfile.ZIP_DEFLATED:Normal na ZIP compression (kinakailangan ang zlib module)
  • zipfile.ZIP_BZIP2:BZIP2 compression (kailangan ng bz2 module)
  • zipfile.ZIP_LZMA:LZMA compression (kailangan ng lzma module)

Ang BZIP2 at LZMA ay may mas mataas na compression ratio (maaaring i-compress sa mas maliit na sukat), ngunit ang oras na kinakailangan para sa compression ay mas mahaba.

Sa write() method, ang file na may unang argument filename ay isinulat sa isang ZIP file na may pangalawang argument arcname. Kung ang arcname ay tinanggal, ang filename ay ginagamit bilang ay. Ang arcname ay maaari ding tumukoy ng isang istraktura ng direktoryo.

Ang object ng ZipFile ay kailangang isara gamit ang close() na paraan, ngunit kung gagamitin mo ang with statement, awtomatiko itong isasara kapag natapos na ang block.

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')

Sa pamamagitan ng pagtukoy sa compress_type argument ng write() method, posible ring piliin ang compression method para sa bawat file.

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')

Magdagdag ng bagong file sa isang kasalukuyang ZIP file

Upang magdagdag ng bagong file sa isang umiiral nang zip file, itakda ang unang argumento ng constructor sa path ng umiiral na zip file kapag gumagawa ng object ng ZipFile. Gayundin, itakda ang pangalawang mode ng argumento bilang mga sumusunod.a'

Pagkatapos, tulad ng sa halimbawa sa itaas, idagdag lamang ang file gamit ang write() na paraan.

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

I-compress ang isang direktoryo (folder) sa isang ZIP file

Kung gusto mong i-compress ang isang buong direktoryo (folder) sa isang ZIP file, maaari mong gamitin ang os.scandir() o os.listdir() para gumawa ng listahan ng mga file, ngunit mas madaling gamitin ang make_archive() sa shutil modyul.

Tingnan ang sumusunod na artikulo.

Na-compress sa isang ZIP file na may password

Hindi ka pinapayagan ng zipfile module na lumikha ng mga ZIP na protektado ng password. Kung gusto mong i-compress ang isang file sa isang zip file na protektado ng password, gamitin ang third party na library na pyminizip.

Tandaan na ang decompression ng mga ZIP na protektado ng password ay maaaring gawin gamit ang zipfile module (tingnan sa ibaba).

Suriin ang mga nilalaman ng ZIP file.

Maaari mong suriin ang mga nilalaman ng isang umiiral na ZIP file.

Lumikha ng ZipFile object sa pamamagitan ng pagtatakda ng unang argument file sa constructor sa path ng umiiral na zip file at ang pangalawang argument mode sa ‘r’. Maaaring tanggalin ang argumento ng mode dahil ang default ay ‘r’.

Maaari mong gamitin ang namelist() na paraan ng ZipFile object upang makakuha ng listahan ng mga naka-archive na file.

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']

I-extract (i-unpack) ang buong nilalaman ng ZIP file.

Upang i-unpack ang mga nilalaman ng isang ZIP file, lumikha ng ZipFile object na may unang argument file sa constructor bilang path sa umiiral na ZIP file at ang pangalawang argument mode bilang ‘r’, tulad ng sa halimbawa sa itaas. Ang argumento ng mode ay maaaring tanggalin dahil ito ay default sa ‘r’.

Ang extractall() na paraan ng ZipFile object ay nag-extract (nag-uncompress) ng buong nilalaman ng ZIP file. Ang unang argumento, ang landas, ay tumutukoy sa landas ng direktoryo kung saan i-extract. Kung ito ay tinanggal, ang mga file ay i-extract sa kasalukuyang direktoryo.

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

Ang isang ZIP file na may password ay maaaring makuha sa pamamagitan ng pagtukoy sa password bilang argument pwd ng extractall() na pamamaraan.

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

Piliin ang mga nilalaman ng ZIP file at i-extract ito.

Kung gusto mong i-unpack at i-extract ang ilang partikular na file lang, gamitin ang extract() method.

Ang unang argumento ng extract() method ay ang pangalan ng file na i-extract, at ang pangalawang argument path ay ang path ng directory na i-extract. Kung ang argumento ng path ay tinanggal, ang file ay i-extract sa kasalukuyang direktoryo. Ang pangalan ng file na i-extract ay dapat isama ang path sa direktoryo sa ZIP file kung ito ay naka-imbak doon.

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

Tulad ng extractall() method, ang extract() method ay nagpapahintulot din sa iyo na tukuyin ang isang password bilang argument 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')