用python requests下载*.gz压缩文件时损坏

2 投票
1 回答
3706 浏览
提问于 2025-04-18 16:21

我用这段代码(这只是其中一部分)来下载 *.gz 格式的压缩文件。

with requests.session() as s:
    s.post(login_to_site_URL, payload)    
    load = s.get(scene, stream=True)

    with open(path_to_file, "wb") as save_command:
        for chunk in load.iter_content(chunk_size=1024, decode_unicode=False):
            if chunk:
                save_command.write(chunk)
                save_command.flush()

下载后,文件的大小是我通过点击“另存为”下载时的两倍,而且文件是损坏的。这个文件的链接是:http://www.zsrcpod.aviales.ru/modistlm/archive/tlm/geo/00000/28325/terra_77835_20140806_060059.geo.hdf.gz

这个文件需要登录和密码,所以我附上了我访问这个链接时看到的截图:https://i.stack.imgur.com/DGqtS.jpg

看起来有一些选项设置了这个压缩文件为文本格式。

文件的头部信息是:

{'content-length': '58277138',
'content-encoding': 'gzip',
'set-cookie': 'cidaviales=53616c7465645f5fc8f0abdb26f7b0536784ae4e8b302410a288f1f67ccc0afd13ce067d97ba237dc27749d9957f30457f1a1d9763b03637; path=/,
 avialestime=1407386483; path=/; expires=Wed,
 05-Nov-2014 04:41:23 GMT,
ciddaviales=53616c7465645f5fc8f0abdb26f7b0536784ae4e8b302410a288f1f67ccc0afd13ce067d97ba237dc27749d9957f30457f1a1d9763b03637; domain=aviales.ru; path=/',
'accept-ranges': 'bytes',
'server': 'Apache/1.3.37 (Unix) mod_perl/1.30',
'last-modified': 'Wed, 06 Aug 2014 06:17:14 GMT',
'etag': '"21d4e63-3793d12-53e1c86a"',
'date': 'Thu, 07 Aug 2014 04:41:23 GMT',
'content-type': 'text/plain; charset=windows-1251'}

如何使用 Python 的 requests 库正确下载这个文件呢?

1 个回答

4

看起来requests库会自动为你解压内容。你可以在这里查看相关信息。

Requests会自动解压用gzip编码的响应内容,并尽量将响应内容解码为unicode格式。如果需要,你也可以直接访问原始响应(甚至是套接字)。

如果请求头中的Accept-Encoding包含gzip,那么这是默认的行为。你可以通过打印s.request.headers来检查这一点。如果你想获取原始数据,你需要修改这个headers字典,去掉gzip,不过在你的情况下,解压后的数据看起来像是有效的hdf文件,所以直接保存为这个扩展名并使用就可以了!

撰写回答