descomprimir archivos python file gzip urllib2 stringio

descomprimir archivos python



¿Descargar y descomprimir archivos comprimidos en la memoria? (4)

Me gustaría descargar un archivo usando urllib y descomprimir el archivo en la memoria antes de guardarlo.

Esto es lo que tengo ahora:

response = urllib2.urlopen(baseURL + filename) compressedFile = StringIO.StringIO() compressedFile.write(response.read()) decompressedFile = gzip.GzipFile(fileobj=compressedFile, mode=''rb'') outfile = open(outFilePath, ''w'') outfile.write(decompressedFile.read())

Esto termina escribiendo archivos vacíos. ¿Cómo puedo lograr lo que estoy buscando?

Respuesta actualizada:

#! /usr/bin/env python2 import urllib2 import StringIO import gzip baseURL = "https://www.kernel.org/pub/linux/docs/man-pages/" filename = "man-pages-3.34.tar.gz" outFilePath = filename[:-3] response = urllib2.urlopen(baseURL + filename) compressedFile = StringIO.StringIO(response.read()) decompressedFile = gzip.GzipFile(fileobj=compressedFile) with open(outFilePath, ''w'') as outfile: outfile.write(decompressedFile.read())


Para aquellos que usan Python 3, la respuesta equivalente es:

import urllib.request import io import gzip response = urllib.request.urlopen(FILE_URL) compressed_file = io.BytesIO(response.read()) decompressed_file = gzip.GzipFile(fileobj=compressed_file) with open(OUTFILE_PATH, ''wb'') as outfile: outfile.write(decompressed_file.read())


Si tienes Python 3.2 o superior, la vida sería mucho más fácil:

#!/usr/bin/env python3 import gzip import urllib.request baseURL = "https://www.kernel.org/pub/linux/docs/man-pages/" filename = "man-pages-4.03.tar.gz" outFilePath = filename[:-3] response = urllib.request.urlopen(baseURL + filename) with open(outFilePath, ''wb'') as outfile: outfile.write(gzip.decompress(response.read()))

Para aquellos que están interesados ​​en la historia, consulte https://bugs.python.org/issue3488 y https://hg.python.org/cpython/rev/3fa0a9553402 .


gzip.GzipFile() buscar el comienzo de compressedFile después de escribir en él, pero antes de pasarlo a gzip.GzipFile() . De lo contrario, será leído desde el final por el módulo gzip y aparecerá como un archivo vacío en él. Vea abajo:

#! /usr/bin/env python import urllib2 import StringIO import gzip baseURL = "https://www.kernel.org/pub/linux/docs/man-pages/" filename = "man-pages-3.34.tar.gz" outFilePath = "man-pages-3.34.tar" response = urllib2.urlopen(baseURL + filename) compressedFile = StringIO.StringIO() compressedFile.write(response.read()) # # Set the file''s current position to the beginning # of the file so that gzip.GzipFile can read # its contents from the top. # compressedFile.seek(0) decompressedFile = gzip.GzipFile(fileobj=compressedFile, mode=''rb'') with open(outFilePath, ''w'') as outfile: outfile.write(decompressedFile.read())


Código de una línea para imprimir el contenido del archivo descomprimido:

print gzip.GzipFile(fileobj=StringIO.StringIO(urllib2.urlopen(DOWNLOAD_LINK).read()), mode=''rb'').read()