用Python解压缩远程.gz文件

时间:2013-04-26 16:51:36

标签: python gzip

我遇到了Python的问题。

我的情况:我是来自合作伙伴平台的gzip压缩文件(即h..p // .... namesite ... / xxx) 如果我点击浏览器中的链接,它将下载一个文件(例如namefile.xml.gz)。

所以......如果我用python读取这个文件,我可以解压缩并阅读它。

代码:

content = gzip.open(namefile.xml.gz,'rb')
print content.read()

但是如果我尝试从远程源读取文件,我就不能。 从远程文件我只能读取编码的字符串,但不能解码它。

代码:

response = urllib2.urlopen(url)
encoded =response.read()
print encoded

使用此代码我可以读取编码的字符串...但我无法用gzip或lzip解码它。

有什么建议吗? 非常感谢

3 个答案:

答案 0 :(得分:4)

不幸的是@Aya建议的方法不起作用,因为GzipFile广泛使用文件对象的seek方法(响应不支持)。

所以你基本上有两个选择:

  1. 将远程文件的内容读入io.StringIO,并将对象传递给gzip.GzipFile(如果文件很小)

  2. 将文件下载到磁盘上的临时文件中,并使用gzip.open

  3. 还有另一种选择(需要一些编码) - 使用zlib模块实现自己的阅读器。这很容易,但你需要知道一个魔术常数(How can I decompress a gzip stream with zlib?)。

答案 1 :(得分:0)

对于Python v3.2或更高版本,您可以使用gzip.GzipFile类来包装urllib2.urlopen()返回的文件对象,如下所示......

import urllib2
import gzip

response = urllib2.urlopen(url)
gunzip_response = gzip.GzipFile(fileobj=response)
content = gunzip_response.read()
print content

...在您阅读时会透明地解压缩响应流。

答案 2 :(得分:0)

如果你使用Python 3.2或更高版本,GzipFile中的错误(需要tell支持)是固定的,但他们显然不会将修复程序向后移植到Python 2.x