下载大型zip文件的特定部分

时间:2018-12-10 14:52:34

标签: python zip amazon-glacier

我正在AWS Glacier上存储一些大型zip文件,并且想知道是否可以在不下载整个zip的情况下从zip下载一个或多个特定文件吗?

就像我知道字节范围92492到151231对应于特定文件一样(假设甚至有可能...),如果我仅下载zip的那一部分,是否有办法提取它?

2 个答案:

答案 0 :(得分:1)

zip文件的central directory位于文件的末尾。其中的最后一个条目,中央目录记录的 End ,给出了该目录开始的偏移量。

因此,您可以阅读整个中央目录,并在其中搜索所需的文件名条目。此项说明该文件的本地文件头的起始位置及其大小(压缩后的大小)。读取该标头将说明文件的起始位置。该文件后可以跟一个数据描述符。这样就提供了仅检索带有标题和描述符的文件所需的所有信息。

尽管您现在具有足够的信息来解压缩文件,但是大多数工具将需要一个仅与此文件相对应的中央目录,您必须重新创建该目录。我的Fedora上的zip手册页表明zip -FF可能会“修复”缺少中央目录的档案。

答案 1 :(得分:0)

这取决于服务器,但是您可以将byte-range参数传递给请求。如果服务器接受,则将为您提供所需的数据。

但是我认为您将无法提取数据。

import requests
url = 'http://i.imgur.com/z4d4kWk.jpg'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
    'Range': 'bytes=1000-1023'
}

response = requests.get(url, headers=headers)
print(response.headers['Content-Range'])

返回:

bytes 1000-1023/146515