create python gzip

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)

Lea más: http://docs.python.org/library/zlib.html


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)