代码之家  ›  专栏  ›  技术社区  ›  Paul D. Waite

如何从urlib.urlopen()返回的类似对象_的文件创建gzip文件实例?

  •  14
  • Paul D. Waite  · 技术社区  · 14 年前

    我在用python玩堆栈溢出API。我尝试解码API提供的gzip响应。

    import urllib, gzip
    
    url = urllib.urlopen('http://api.stackoverflow.com/1.0/badges/name')
    gzip.GzipFile(fileobj=url).read()
    

    根据 the urllib2 documentation , urlopen _156;返回类似对象__的文件。

    但是,当我跑步时 read() 在使用gzip文件创建的gzip文件对象上,我得到以下错误:

    AttributeError: addinfourl instance has no attribute 'tell'
    

    据我所知,这是来自 乌尔松 .

    它看起来也没有seek,因为我在执行此操作时出错:

    url.read()
    url.seek(0)
    

    这个对象到底是什么,以及如何创建一个函数 GzipFile 它的实例?

    2 回复  |  直到 9 年前
        1
  •  10
  •   hd1 Madan Sapkota    9 年前

    这个 urlopen docs 列出返回对象的支持方法。我建议将对象包装在另一个类中,该类支持gzip期望的方法。

    其他选项:调用响应对象的read方法,并将结果放入 StringIO 对象(应该支持gzip期望的所有方法)。不过这个可能要贵一点。

    例如。

    import gzip
    import json
    import StringIO
    import urllib
    
    url = urllib.urlopen('http://api.stackoverflow.com/1.0/badges/name')
    url_f = StringIO.StringIO(url.read())
    g = gzip.GzipFile(fileobj=url_f)
    j = json.load(g)
    
        2
  •  8
  •   unutbu    14 年前
    import urllib2
    import json
    import gzip
    import io
    
    url='http://api.stackoverflow.com/1.0/badges/name'
    page=urllib2.urlopen(url)
    gzip_filehandle=gzip.GzipFile(fileobj=io.BytesIO(page.read()))
    json_data=json.loads(gzip_filehandle.read())
    print(json_data)
    

    io.BytesIO 适用于python2.6+。对于旧版本的python,可以使用 cStringIO.StringIO .