python - ordenar - Extrayendo un archivo zip en la memoria?
importar archivo txt a python (3)
Razones probables:
1. Este módulo actualmente no maneja archivos ZIP de varios discos. (O)
2.Compruebe con StringIO.getvalue () el clima del error Unicode se acerca.
¿Cómo extraigo un zip en la memoria?
Mi intento (devolver None
en .getvalue()
):
from zipfile import ZipFile
from StringIO import StringIO
def extract_zip(input_zip):
return StringIO(ZipFile(input_zip).extractall())
Trabajando frecuentemente con archivos, recomendaría hacer una herramienta para trabajar cómodamente con archivos en memoria. Algo como esto:
import zipfile
import StringIO
class InMemoryZip(object):
def __init__(self):
# Create the in-memory file-like object for working w/imz
self.in_memory_zip = StringIO.StringIO()
# Just zip it, zip it
def append(self, filename_in_zip, file_contents):
# Appends a file with name filename_in_zip and contents of
# file_contents to the in-memory zip.
# Get a handle to the in-memory zip in append mode
zf = zipfile.ZipFile(self.in_memory_zip, "a", zipfile.ZIP_DEFLATED, False)
# Write the file to the in-memory zip
zf.writestr(filename_in_zip, file_contents)
# Mark the files as having been created on Windows so that
# Unix permissions are not inferred as 0000
for zfile in zf.filelist:
zfile.create_system = 0
return self
def read(self):
# Returns a string with the contents of the in-memory zip.
self.in_memory_zip.seek(0)
return self.in_memory_zip.read()
# Zip it, zip it, zip it
def writetofile(self, filename):
# Writes the in-memory zip to a file.
f = file(filename, "wb")
f.write(self.read())
f.close()
if __name__ == "__main__":
# Run a test
imz = InMemoryZip()
imz.append("testfile.txt", "Make a test").append("testfile2.txt", "And another one")
imz.writetofile("testfile.zip")
Funciona de maravilla
extractall
extrae al sistema de archivos para que no obtenga lo que desea. Para extraer un archivo en la memoria, use el método de read
.
Si realmente necesita todo el contenido en la memoria, podría hacer algo como:
def extract_zip(input_zip):
input_zip=ZipFile(input_zip)
return {name: input_zip.read(name) for name in input_zip.namelist()}