zipfile untuk memampatkan dan menyahmampat fail ZIP dalam Python

Perniagaan

Modul fail zip pustaka standard Python boleh digunakan untuk memampatkan fail ke dalam ZIP dan menyahmampat fail ZIP. Ia disertakan dalam perpustakaan standard, jadi tiada pemasangan tambahan diperlukan.

Diterangkan kandungan berikut.

  • Mampatkan berbilang fail ke dalam fail ZIP
  • Tambahkan fail baharu pada fail ZIP sedia ada
  • Mampatkan direktori (folder) ke dalam fail ZIP
  • Dimampatkan ke dalam fail ZIP dengan kata laluan
  • Semak kandungan fail ZIP.
  • Ekstrak (buka bungkusan) keseluruhan kandungan fail ZIP.
  • Pilih kandungan fail ZIP dan ekstraknya.

Mampatkan berbilang fail ke dalam fail ZIP

Cipta objek ZipFile dan gunakan kaedah write() untuk menambah fail yang ingin anda mampatkan.

Untuk mencipta fail ZIP baharu, tentukan laluan fail ZIP yang akan dibuat sebagai hujah pertama pembina objek ZipFile dan hujah kedua seperti berikutw'

Di samping itu, kaedah mampatan boleh ditentukan sebagai hujah ketiga.

  • zipfile.ZIP_STORED:Hanya gabungkan berbilang fail tanpa pemampatan (lalai)
  • zipfile.ZIP_DEFLATED:Mampatan ZIP biasa (modul zlib diperlukan)
  • zipfile.ZIP_BZIP2:Pemampatan BZIP2 (modul bz2 diperlukan)
  • zipfile.ZIP_LZMA:Mampatan LZMA (modul lzma diperlukan)

BZIP2 dan LZMA mempunyai nisbah mampatan yang lebih tinggi (boleh dimampatkan kepada saiz yang lebih kecil), tetapi masa yang diperlukan untuk pemampatan lebih lama.

Dalam kaedah write(), fail dengan nama fail argumen pertama ditulis pada fail ZIP dengan nama arka argumen kedua. Jika nama arc ditinggalkan, nama fail digunakan sebagaimana adanya. arcname juga boleh menentukan struktur direktori.

Objek ZipFile perlu ditutup dengan kaedah close(), tetapi jika anda menggunakan pernyataan with, ia akan ditutup secara automatik apabila blok itu selesai.

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

Dengan menentukan hujah compress_type kaedah write(), ia juga mungkin untuk memilih kaedah mampatan untuk setiap fail.

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

Tambahkan fail baharu pada fail ZIP sedia ada

Untuk menambah fail baharu pada fail zip sedia ada, tetapkan hujah pertama pembina kepada laluan fail zip sedia ada semasa mencipta objek ZipFile. Juga, tetapkan mod hujah kedua seperti berikut.a'

Kemudian, seperti dalam contoh di atas, tambah sahaja fail menggunakan kaedah write().

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

Mampatkan direktori (folder) ke dalam fail ZIP

Jika anda ingin memampatkan keseluruhan direktori (folder) ke dalam satu fail ZIP, anda boleh menggunakan os.scandir() atau os.listdir() untuk membuat senarai fail, tetapi lebih mudah untuk menggunakan make_archive() dalam shutil modul.

Lihat artikel berikut.

Dimampatkan ke dalam fail ZIP dengan kata laluan

Modul zipfile tidak membenarkan anda membuat ZIP yang dilindungi kata laluan. Jika anda ingin memampatkan fail ke dalam fail zip yang dilindungi kata laluan, gunakan pyminizip perpustakaan pihak ketiga.

Ambil perhatian bahawa penyahmampatan ZIP yang dilindungi kata laluan boleh dilakukan dengan modul fail zip (lihat di bawah).

Semak kandungan fail ZIP.

Anda boleh menyemak kandungan fail ZIP sedia ada.

Cipta objek ZipFile dengan menetapkan fail argumen pertama dalam pembina ke laluan fail zip sedia ada dan mod argumen kedua kepada ‘r’. Argumen mod boleh ditinggalkan kerana lalai ialah ‘r’.

Anda boleh menggunakan kaedah senarai nama() objek ZipFile untuk mendapatkan senarai fail yang diarkibkan.

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

Ekstrak (buka bungkusan) keseluruhan kandungan fail ZIP.

Untuk membongkar kandungan fail ZIP, cipta objek ZipFile dengan fail argumen pertama dalam pembina sebagai laluan ke fail ZIP sedia ada dan mod argumen kedua sebagai ‘r’, seperti dalam contoh di atas. Argumen mod boleh ditinggalkan kerana ia lalai kepada ‘r’.

Kaedah extractall() objek ZipFile mengekstrak (menyahmampat) keseluruhan kandungan fail ZIP. Argumen pertama, laluan, menentukan laluan direktori untuk diekstrak. Jika ia ditinggalkan, fail akan diekstrak ke direktori semasa.

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

Fail ZIP dengan kata laluan boleh diekstrak dengan menentukan kata laluan sebagai hujah pwd kaedah extractall().

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

Pilih kandungan fail ZIP dan ekstraknya.

Jika anda ingin membongkar dan mengekstrak fail tertentu sahaja, gunakan kaedah extract().

Argumen pertama kaedah extract() ialah nama fail untuk diekstrak, dan laluan argumen kedua ialah laluan direktori untuk diekstrak. Jika hujah laluan ditinggalkan, fail akan diekstrak ke direktori semasa. Nama fail yang akan diekstrak hendaklah termasuk laluan ke direktori dalam fail ZIP jika ia disimpan di sana.

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

Seperti kaedah extractall(), kaedah extract() juga membolehkan anda menentukan kata laluan sebagai hujah 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')