Dosya dolduğunda python'un ZipFile.writestr () işlevinin başarısız olup olmadığını nasıl anlayabilirim?

Zip64 uzantılarını kullanmadan bir Zip dosyası boyut olarak 2 GB'den fazla olamaz, bu nedenle bu sınırın üzerine yerleştirilecek bir dosyaya yazmaya çalışmak işe yaramaz. Böyle bir yazım denendiğinde, bunun bir istisna olacağını umuyorum, fakat bir kişinin yetiştirilmesine neden olamadım. (Bu konuyla ilgili dokümantasyon sessizdir.) Böyle bir durumda istisna oluşmazsa, yazının başarılı olup olmadığını nasıl belirleyebilirim?

3
Doğruysa, bunu bir hata olarak bildirin . Hatalar sessizce geçmemelidir. (Düzenle: en son sürümü kullandığınızı varsayarak, yani.)
katma yazar Michael Hoffman, kaynak
Dosyanın içeriğini alma ve bir dizeye kaydetme hakkında daha sonra, dizenin uzunluğunu kontrol edin (bir char bir bayttır) ve devam edip etmeyeceğinizi seçin. Düzenleme: Şimdi bunun hakkında düşünüyorum, bu şekilde çok verimli olmayabilir.
katma yazar Griffin, kaynak
Python'un hangi sürümünü kullanıyorsunuz? Python 2.7.2 belgelerinde bulunan zipfile.LargeZipFile istisnası var. ZIP dosyası ZIP64 işlevselliğini gerektirdiğinde, ancak "etkin olmadı"
katma yazar Peter Graham, kaynak

2 cevap

Bir zip arşivi için büyük dizeleri yazmaya çalışan bir istisna var:

$ python write-big-zip.py
Traceback (most recent call last):
  File "write-big-zip.py", line 7, in 
    myzip.writestr('arcname%d'% i, b'a'*2**30)
  File "/usr/lib/python2.7/zipfile.py", line 1125, in writestr
    self._writecheck(zinfo)
  File "/usr/lib/python2.7/zipfile.py", line 1020, in _writecheck
    raise LargeZipFile("Zipfile size would require ZIP64 extensions")
zipfile.LargeZipFile: Zipfile size would require ZIP64 extensions

Komut dosyasını kullanma:

#!/usr/bin/env python
"""Write big strings to zip file until error."""
from zipfile import ZipFile

with ZipFile('big.zip', 'w') as myzip:
    for i in range(4):
        myzip.writestr('arcname%d'% i, b'a'*2**30)
0
katma
Önceden neden istisnayı yakalamadığımı bilmiyorum, ama beklediğiniz gibi açıkça bir tane yükseltiliyor. Onay için teşekkürler!
katma yazar Scott Hunter, kaynak
import os

size = os.path.getsize("file") #Get the size of the file.
size = size/1073741824 #Converting bytes to GB.

if size < 2: # < is probably safer than <=
        #do the zipping
else:
        print "The file is too large!"

Bu ideal değil elbette, ama daha iyi bir tane bulunana kadar geçici bir çözüm olarak hizmet edebilir. Yine, bunun zip kullanmanın çok iyi bir yolu olduğunu düşünmüyorum. Fakat eğer uygun bir istisna yoksa (ki bunun olması gerekir), geçici bir çözüm olarak hizmet edebilir.

0
katma
Hala açık olduğu için, zip dosyasında kullanılabileceğinden emin değil.
katma yazar Scott Hunter, kaynak