[Python-es] zipfile Buffered

gerardo Juarez gerardojuarez en buyteknet.info
Lun Ene 24 17:34:50 CET 2011


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/
>>
>>
>>     
>
>
>
>   



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