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
<jua...@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@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/






_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a