2013-04-26 83 views
1

我有一个Python问题。在Python中解压缩远程.gz文件

我的情况:我有一个来自合作伙伴平台的压缩文件(ieh.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解码它。

任何建议? 非常感谢

回答

4

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

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

  1. 读取远程文件的内容为io.StringIO,并且对象传递到gzip.GzipFile(如果该文件是小)

  2. 将文件下载到一个临时文件在磁盘上,并用gzip.open

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

+0

谢谢,我的文件非常大,我认为“临时文件夹”是最好的方法。 – Nothing 2013-04-29 13:40:45

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 

...这将在读取它时透明地解压缩响应流。

+0

作为@newtover提到,此方法深得不适用于Python 3.2(包括所有2.x版本)。 – 2013-08-27 13:30:15

0

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