1

我对 Python 有疑问。

我的情况:我有一个来自合作伙伴平台的 gzip 文件(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

3 回答 3

4

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

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

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

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

还有另一种选择(需要一些编码) - 使用zlib模块实现您自己的阅读器。这相当容易,但您需要了解一个魔术常数(如何使用 zlib 解压缩 gzip 流?)。

于 2013-04-26T20:15:12.830 回答
0

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

于 2013-08-27T13:28:55.963 回答
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

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

于 2013-04-26T17:03:39.377 回答