create - gzip python 3
Python gzip: ¿hay una manera de descomprimir desde una cadena? (3)
He leído este post tan alrededor del problema en vano.
Estoy tratando de descomprimir un archivo .gz proveniente de una URL.
url_file_handle=StringIO( gz_data )
gzip_file_handle=gzip.open(url_file_handle,"r")
decompressed_data = gzip_file_handle.read()
gzip_file_handle.close()
... pero obtengo TypeError: coacción a Unicode: necesito una cadena o búfer, cStringIO.StringI encontrado
¿Que esta pasando?
Traceback (most recent call last):
File "/opt/google/google_appengine-1.2.5/google/appengine/tools/dev_appserver.py", line 2974, in _HandleRequest
base_env_dict=env_dict)
File "/opt/google/google_appengine-1.2.5/google/appengine/tools/dev_appserver.py", line 411, in Dispatch
base_env_dict=base_env_dict)
File "/opt/google/google_appengine-1.2.5/google/appengine/tools/dev_appserver.py", line 2243, in Dispatch
self._module_dict)
File "/opt/google/google_appengine-1.2.5/google/appengine/tools/dev_appserver.py", line 2161, in ExecuteCGI
reset_modules = exec_script(handler_path, cgi_path, hook)
File "/opt/google/google_appengine-1.2.5/google/appengine/tools/dev_appserver.py", line 2057, in ExecuteOrImportScript
exec module_code in script_module.__dict__
File "/home/jldupont/workspace/jldupont/trunk/site/app/server/tasks/debian/repo_fetcher.py", line 36, in <module>
main()
File "/home/jldupont/workspace/jldupont/trunk/site/app/server/tasks/debian/repo_fetcher.py", line 30, in main
gziph=gzip.open(fh,''r'')
File "/usr/lib/python2.5/gzip.py", line 49, in open
return GzipFile(filename, mode, compresslevel)
File "/usr/lib/python2.5/gzip.py", line 95, in __init__
fileobj = self.myfileobj = __builtin__.open(filename, mode or ''rb'')
TypeError: coercing to Unicode: need string or buffer, cStringIO.StringI found
Considere usar gzip.GzipFile
si no le gusta pasar argumentos oscuros a zlib.decompress
.
Cuando se trata de urllib2.urlopen
respuesta urllib2.urlopen
que puede estar comprimida con gzip o sin comprimir:
import gzip
from StringIO import StringIO
# response = urllib2.urlopen(...
content_raw = response.read()
if ''gzip'' in response.info().getheader(''Content-Encoding''):
content = gzip.GzipFile(fileobj=StringIO(content_raw)).read()
Cuando trata con un archivo que puede almacenar datos comprimidos con gzip o sin comprimir:
import gzip
# some_file = open(...
try:
content = gzip.GzipFile(fileobj=some_file).read()
except IOError:
some_file.seek(0)
content = some_file.read()
Los ejemplos anteriores están en Python 2.7
Si sus datos ya están en una cadena, pruebe con zlib, que afirma ser totalmente compatible con gzip:
import zlib
decompressed_data = zlib.decompress(gz_data, 16+zlib.MAX_WBITS)
gzip.open
es una abreviatura para abrir un archivo, lo que desea es gzip.GzipFile
que puede pasar un archivoobj
open(filename, mode=''rb'', compresslevel=9)
#Shorthand for GzipFile(filename, mode, compresslevel).
vs
class GzipFile
__init__(self, filename=None, mode=None, compresslevel=9, fileobj=None)
# At least one of fileobj and filename must be given a non-trivial value.
así que esto debería funcionar para ti
gzip_file_handle = gzip.GzipFile(fileobj=url_file_handle)