Hoe weet je of Zipphile.writestr () van python is mislukt omdat het bestand vol is?

Zonder zip64-extensies te gebruiken, mag een Zip-bestand niet meer dan 2 GB groot zijn, dus proberen te schrijven naar een bestand dat de limiet overschrijdt, werkt niet. Ik verwachtte dat wanneer een dergelijk schrijven werd geprobeerd, dit een uitzondering zou opwerpen, maar ik heb niet kunnen veroorzaken dat er een wordt verhoogd. (De documentatie zwijgt over de kwestie.) Als een uitzondering niet in een dergelijke situatie wordt opgeheven, hoe zou ik (efficiënt) gaan over het bepalen of de schrijf slaagde of niet?

3
Als dit waar is, moet u dit melden als een bug . Fouten mogen niet stil overgaan. (Bewerken: ervan uitgaande dat u de nieuwste versie gebruikt, dat is.)
toegevoegd de auteur Michael Hoffman, de bron
Hoe zit het met het ophalen van de inhoud van het bestand en het op te slaan in een string, controleer dan de lengte van de string (één teken is één byte) en kies of u wilt doorgaan? Bewerken: nu ik erover nadenk, is die manier misschien niet erg efficiënt.
toegevoegd de auteur Griffin, de bron
Welke versie van Python gebruikt u? De Python 2.7.2-documenten hebben een zipfile.LargeZipFile -uitzondering die is verhoogd "wanneer een ZIP-bestand de ZIP64-functionaliteit zou vereisen, maar dat niet is ingeschakeld."
toegevoegd de auteur Peter Graham, de bron

2 antwoord

Ik heb een uitzondering bij het schrijven van grote strings naar een zip-archief:

$ 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

Het gebruik van het script:

#!/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
toegevoegd
Ik weet niet zeker waarom ik de uitzondering niet eerder ving, maar er wordt duidelijk een verhoogd, zoals je zou verwachten. Bedankt voor de bevestiging!
toegevoegd de auteur Scott Hunter, de bron
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!"

Dit is natuurlijk niet ideaal, maar het kan een tijdelijke oplossing zijn totdat er een betere is gevonden. Nogmaals, ik denk niet dat dit een erg goede manier is om zip te gebruiken. Maar als er geen passende uitzondering is (wat er wel zou moeten zijn), zou het kunnen dienen als een tijdelijke oplossing.

0
toegevoegd
Niet zeker of dit kan worden gebruikt in het zipbestand, omdat het nog steeds geopend is.
toegevoegd de auteur Scott Hunter, de bron