[Python-es] zipfile Buffered

Andrey Antoukh andsux en gmail.com
Lun Ene 24 20:14:59 CET 2011


http://docs.python.org/py3k/library/zipfile.html

ZipFile.open(name, mode='r', pwd=None)
Extract a member from the archive as a file-like object (ZipExtFile). name
is the name of the file in the archive, or a ZipInfo object. The mode
parameter, if included, must be one of the following: 'r' (the default),
'U', or 'rU'. Choosing 'U' or 'rU' will enable universal newline support in
the read-only object. pwd is the password used for encrypted files. Calling
open() on a closed ZipFile will raise a RuntimeError.

Note The file-like object is read-only and provides the following methods:
read(), readline(), readlines(), __iter__(), __next__().

Lo que a groso modo quiere decir que devuelve un objeto fichero que tiene
todos los métodos estándares para leer. De lo que se deduce que podemos
leerlos a cachitos para que no ocupe memoria.

La implementación seria parecida a la que ya se ha propuesto.  O como el
simple ejemplo...

>>> zipobj = zipfile.ZipFile("prueba.zip", "r")
>>> for zip in zipobj.namelist():
...     zipfileobj = zipobj.open(zip, "r")
...     for chuck in zipfileobj:
...         # lo que sea que tengas que hacer con estos datos.

Un saludo.


El día 24 de enero de 2011 17:34, gerardo Juarez <
gerardojuarez en buyteknet.info> escribió:
> Creo que lo que Juan de Dios pregunta es si es posible escribir un código
> como el que él cita o si existe un equivalente. Por eso lo etiquetó como
> "sólo como muestra".
>
> El problema es que Zipfile tiene en efecto el método read(), pero en el
> manual no dice que acepte un argumento que
> indique cuántos bytes queremos que lea. Según el manual, sólo se llama
> read() una vez por cada entrada del directorio del ZIP,
> y cada vez extrae *todo* el archivo. Si los archivos son muy grandes, qué
> hace read()? Los extrae a un sitio temporal? Maneja
> automáticamente un "buffer"? Arroja una excepción si le falta memoria? Hay
> que manejar todo esto a mano? Si es cierto esto
> último, cómo se hace?
>
> Gerardo
>
> Andrey Antoukh wrote:
>>
>> El día 22 de enero de 2011 11:45, Juan de Dios Manjón Pérez
>> <juande en jdmanjon.net> escribió:
>>
>>>
>>> Mi objetivo es manipular ficheros zip sin  tener que extraer a un temp y
>>> sin
>>> tener que leer todo de golpe con readstring = zin.read(item.filename)
>>>
>>>
>>
>> Bueno, en el ejemplo que muestras, no estas leyendo todo de golpe, si
>> no que por trocitos de tamaño que esta definido en
>> io.DEFAULT_BUFFER_SIZE. Por lo que si no me equivoco, el mismo ejemplo
>> ya hace justo lo que pides.
>>
>> Creo que si has tenido que escribir 2 veces el mismo mensaje, para que
>> te responda alguien creo que deberías de mirar si la pregunta que has
>> hecho es la adecuada.
>>
>> Un saludo.
>>
>>
>>
>>>
>>> Y el motivo es claro: quiero trabajar con ficheros zip con entradas de
>>> gran
>>> tamaño.
>>>
>>> Se me fué la indentación en el for:
>>>
>>> BUFFER_SIZE = io.DEFAULT_BUFFER_SIZE¶
>>>
>>> zin = zipfile.ZipFile ('archive.zip', 'r')
>>> zout = zipfile.ZipFile ('archve_new.zip', 'w')
>>>
>>> for item in zin.infolist():
>>>    reader = zin.BufferedReader(item.filename, BUFFER_SIZE)
>>>    writer = zout.BufferedWriter(item.filename, BUFFER_SIZE)
>>>    chuck = reader.read(BUFFER_SIZE)
>>>    while chuck:
>>>        writer.write(chuck)
>>>        chuck = reader.read(BUFFER_SIZE)
>>>    reader.close()
>>>    writer.close()
>>>
>>> zin.close()
>>> zout.close()
>>>
>>>
>>> A ver si alguien tiene información de como implementarlo......
>>>
>>> Saludos
>>> Juande
>>>
>>> El 21/01/2011 14:10, Juan de Dios Manjón Pérez escribió:
>>>
>>> BUFFER_SIZE = io.DEFAULT_BUFFER_SIZE¶
>>>
>>> zin = zipfile.ZipFile ('archive.zip', 'r')
>>>
>>> zout = zipfile.ZipFile ('archve_new.zip', 'w')
>>>
>>> for item in zin.infolist():
>>>    reader = zin.BufferedReader(item.filename, BUFFER_SIZE)
>>>    writer = zout.BufferedWriter(item.filename, BUFFER_SIZE)
>>>
>>> chuck = reader.read(BUFFER_SIZE)
>>> while chuck:
>>>     writer.write(chuck)
>>>     chuck = reader.read(BUFFER_SIZE)
>>>
>>> reader.close()
>>> writer.close()
>>>
>>> _______________________________________________
>>> Python-es mailing list
>>> Python-es en python.org
>>> http://mail.python.org/mailman/listinfo/python-es
>>> FAQ: http://python-es-faq.wikidot.com/
>>>
>>>
>>>
>>
>>
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>



-- 
http://twitter.com/andsux
http://www.niwi.be
****
http://www.freebsd.org/
http://www.postgresql.org/
http://www.python.org/
http://www.djangoproject.com/

"Linux is for people who hate Windows, BSD is for people who love UNIX"
"Social Engineer -> Because there is no patch for human stupidity"
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110124/012d64b8/attachment.html>


Más información sobre la lista de distribución Python-es