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()