El ejemplo proporcionado Ethier tiene varios problemas, algunos de ellos de gran intensidad:
- no funciona para los datos reales en Windows. Un archivo ZIP es binario y sus datos siempre deben escribirse con un archivo abierto 'wb'
- al que se anexa el archivo ZIP para cada archivo, esto es ineficaz. Solo se puede abrir y mantener como un atributo
InMemoryZip
- la documentación indica que los archivos ZIP deben cerrarse explícitamente, esto no se hace en la función de adición (probablemente funciona (por ejemplo) porque zf sale del alcance y eso cierra el archivo ZIP)
- el indicador create_system se establece para todos los archivos en el archivo zip cada vez que se agrega un archivo en lugar de solo una vez por archivo.
- en Python 3 < cStringIO es mucho más eficiente que StringIO
- no funciona en Python 3 (el artículo original fue desde antes de la versión 3.0, pero por el momento el código fue publicada 3.1 había estado fuera durante mucho hora).
Hay una versión actualizada disponible si instala ruamel.std.zipfile
(de los que soy el autor).Después
pip install ruamel.std.zipfile
o incluso el código para la clase de here, que puede hacer:
import ruamel.std.zipfile as zipfile
# Run a test
zipfile.InMemoryZipFile()
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
imz.writetofile("test.zip")
Usted puede escribir alternativamente el contenido usando imz.data
a cualquier lugar que necesite.
También puede utilizar la instrucción with
, y si se proporciona un nombre de archivo, el contenido de la postal será escrito en dejar ese contexto:
with zipfile.InMemoryZipFile('test.zip') as imz:
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
debido a la escritura demorada en un disco, en realidad se puede lea desde un antiguo test.zip
dentro de ese contexto.
OK, veo que estaba equivocado acerca de la ZipFile después de todo. Gracias a todos. –