使用多个线程下载单个文件

2024-04-26 19:11:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为Linux创建一个“下载管理器”,它允许我使用多个线程下载一个文件。这就是我要做的:

  1. 通过指定偏移量将要下载的文件分成不同的部分
  2. 将不同部分下载到临时位置
  3. 将它们合并到一个文件中。在

第2步和第3步是可解的,而在第1步我被卡住了。下载文件时如何指定偏移量?在

使用open("/path/to/file", "wb").write(urllib2.urlopen(url).read())这样的代码并不能让我指定要读取的起始点。有没有别的办法?在


Tags: 文件topathurl管理器readlinuxopen
3条回答

要下载部分文件,只需将Range头设置为如下所示

req = urllib2.Request(url)
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)

但并非所有服务器都支持Range头。大多数文件共享服务没有

首先,http服务器应该返回Content-Length头。这通常意味着文件是一个静态文件,如果是动态文件,比如php或jsp的结果,就不能做这样的拆分。在

然后,可以在请求时使用http范围头,这个头告诉服务器文件的哪个部分应该返回。关于如何设置和解析http头部,请参阅python文档。在

要做到这一点,如果零件尺寸是100k,你首先请求的范围为:0-1000000 100k将得到第一个零件,并在其内容长度的响应中告诉你文件的大小,然后启动一些不同范围的线程,它就可以工作了

看到了吗文件.seek在http://docs.python.org/library/stdtypes.html#file-objects中。在

这也许能解决问题。在

出于兴趣,拆分文件的原因是什么?在

相关问题 更多 >