Python’da ZIP dosyalarını sıkıştırmak ve açmak için zipfile

Python standart kitaplığının zip dosyası modülü, dosyaları ZIP’lere sıkıştırmak ve ZIP dosyalarını açmak için kullanılabilir. Standart kitaplıkta bulunur, bu nedenle ek kurulum gerekmez.

Aşağıdaki içerikler açıklanmıştır.

  • Birden çok dosyayı bir ZIP dosyasına sıkıştırın
  • Mevcut bir ZIP dosyasına yeni bir dosya ekleyin
  • Bir dizini (klasörü) bir ZIP dosyasına sıkıştırın
  • Şifreli bir ZIP dosyasına sıkıştırılmış
  • ZIP dosyasının içeriğini kontrol edin.
  • ZIP dosyasının tüm içeriğini çıkarın (paketinden çıkarın).
  • ZIP dosyasının içeriğini seçin ve çıkarın.

Birden çok dosyayı bir ZIP dosyasına sıkıştırın

Bir ZipFile nesnesi oluşturun ve sıkıştırmak istediğiniz dosyaları eklemek için write() yöntemini kullanın.

Yeni bir ZIP dosyası oluşturmak için, oluşturulacak ZIP dosyasının yolunu ZipFile nesnesinin yapıcısının ilk argümanı olarak ve ikinci argümanı aşağıdaki gibi belirtin.w'

Ek olarak, sıkıştırma yöntemi üçüncü argüman olarak belirtilebilir.

  • zipfile.ZIP_STORED:Birden çok dosyayı sıkıştırmadan birleştirmeniz yeterlidir (varsayılan)
  • zipfile.ZIP_DEFLATED:Normal ZIP sıkıştırması (zlib modülü gerekli)
  • zipfile.ZIP_BZIP2:BZIP2 sıkıştırması (bz2 modülü gerekli)
  • zipfile.ZIP_LZMA:LZMA sıkıştırması (lzma modülü gerekli)

BZIP2 ve LZMA daha yüksek bir sıkıştırma oranına sahiptir (daha küçük bir boyuta sıkıştırılabilir), ancak sıkıştırma için gereken süre daha uzundur.

write() yönteminde, ilk argüman dosya adına sahip dosya, ikinci argüman yay adına sahip bir ZIP dosyasına yazılır. Ark adı atlanırsa, dosya adı olduğu gibi kullanılır. arcname ayrıca bir dizin yapısı da belirtebilir.

ZipFile nesnesinin close() yöntemiyle kapatılması gerekir, ancak with ifadesini kullanırsanız, blok bittiğinde otomatik olarak kapatılacaktır.

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

write() yönteminin sıkıştırma_türü bağımsız değişkenini belirterek, her dosya için sıkıştırma yöntemini seçmek de mümkündür.

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

Mevcut bir ZIP dosyasına yeni bir dosya ekleyin

Mevcut bir zip dosyasına yeni bir dosya eklemek için, ZipFile nesnesini oluştururken kurucunun ilk argümanını mevcut zip dosyasının yoluna ayarlayın. Ayrıca, ikinci argüman modunu aşağıdaki gibi ayarlayın.a'

Ardından, yukarıdaki örnekte olduğu gibi, dosyayı write() yöntemini kullanarak eklemeniz yeterlidir.

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

Bir dizini (klasörü) bir ZIP dosyasına sıkıştırın

Tüm bir dizini (klasörü) tek bir ZIP dosyasına sıkıştırmak istiyorsanız, dosyaların bir listesini yapmak için os.scandir() veya os.listdir()’i kullanabilirsiniz, ancak make_archive()’ı Shutil’de kullanmak daha kolaydır. modül.

Aşağıdaki makaleye bakın.

Şifreli bir ZIP dosyasına sıkıştırılmış

Zip dosyası modülü, parola korumalı ZIP’ler oluşturmanıza izin vermez. Bir dosyayı parola korumalı bir zip dosyasına sıkıştırmak istiyorsanız, üçüncü taraf pyminizip kitaplığını kullanın.

Parola korumalı ZIP’lerin dekompresyonunun zipfile modülüyle yapılabileceğini unutmayın (aşağıya bakın).

ZIP dosyasının içeriğini kontrol edin.

Mevcut bir ZIP dosyasının içeriğini kontrol edebilirsiniz.

Yapıcıdaki ilk argüman dosyasını mevcut zip dosyasının yoluna ve ikinci argüman modunu ‘r’ olarak ayarlayarak bir ZipFile nesnesi oluşturun. Varsayılan ‘r’ olduğundan mod bağımsız değişkeni atlanabilir.

Arşivlenmiş dosyaların bir listesini almak için ZipFile nesnesinin namelist() yöntemini kullanabilirsiniz.

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 dosyasının tüm içeriğini çıkarın (paketinden çıkarın).

Bir ZIP dosyasının içeriğini açmak için, yukarıdaki örnekte olduğu gibi, mevcut ZIP dosyasının yolu olarak kurucudaki ilk argüman dosyası ve ‘r’ olarak ikinci argüman modu ile bir ZipFile nesnesi oluşturun. Mod argümanı, varsayılan olarak ‘r’ olduğu için atlanabilir.

ZipFile nesnesinin extractall() yöntemi, ZIP dosyasının tüm içeriğini çıkarır (sıkıştırmayı açar). İlk argüman, yol, ayıklanacak dizinin yolunu belirtir. Atlanırsa, dosyalar geçerli dizine çıkarılacaktır.

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

Parola içeren bir ZIP dosyası, parolayı Extractall() yönteminin pwd bağımsız değişkeni olarak belirterek çıkarılabilir.

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

ZIP dosyasının içeriğini seçin ve çıkarın.

Yalnızca belirli dosyaları açmak ve ayıklamak istiyorsanız, extract() yöntemini kullanın.

Extract() yönteminin ilk argümanı, ayıklanacak dosyanın adıdır ve ikinci argüman yolu, ayıklanacak dizinin yoludur. Yol bağımsız değişkeni atlanırsa, dosya geçerli dizine ayıklanır. Çıkarılacak dosyanın adı, orada depolanıyorsa, ZIP dosyasındaki dizinin yolunu içermelidir.

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

Extractall() yöntemi gibi, Extract() yöntemi de pwd bağımsız değişkeni olarak bir parola belirlemenize olanak tanır.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')