如何在 Python 中恢复文件下载?

Posted

技术标签:

【中文标题】如何在 Python 中恢复文件下载?【英文标题】:How to resume file download in Python? 【发布时间】:2014-05-18 14:54:44 【问题描述】:

我正在使用 python 2.7 requests 模块使用以下代码下载二进制文件,如何使此代码“自动恢复”部分下载文件的下载。

r = requests.get(self.fileurl, stream=True,  verify=False, allow_redirects=True)
if r.status_code == 200:
    CHUNK_SIZE = 8192
    bytes_read = 0
    with open(FileSave, 'wb') as f:
        itrcount=1
        for chunk in r.iter_content(CHUNK_SIZE):
            itrcount=itrcount+1
            f.write(chunk)
            bytes_read += len(chunk)
            total_per = 100 * float(bytes_read)/float(long(audiosize)+long(videoSize))


            self.progress_updates.emit('%d\n%s' % (total_per, 'Download Progress : ' + self.size_human(itrcount*CHUNK_SIZE) + '/' + Total_Size))
r.close()

如果可能的话,我宁愿只使用requests 模块来实现这一点。

【问题讨论】:

【参考方案1】:

如果 Web 服务器支持范围请求,那么您可以将 Range 标头添加到您的请求中:

Range: bytes=StartPos-StopPos

您将收到 StartPos 和 StopPos 之间的部分。如果不知道 StopPos,只需使用:

Range: bytes=StartPos-

所以你的代码是:

def resume_download(fileurl, resume_byte_pos):
    resume_header = 'Range': 'bytes=%d-' % resume_byte_pos
    return requests.get(fileurl, headers=resume_header, stream=True,  verify=False, allow_redirects=True)

【讨论】:

您还需要将文件模式从“wb”更改为“ab”(追加,否则您将覆盖已保存的部分)。 为了将来参考,resume_byte_pos是文件的当前大小,还是文件的当前大小减一? @Klik 肯定不是当前文件大小减一 - 如果您下载了 0 个字节,那么您不想从 -1 开始 :) 索引从 0 开始,因此您应该将当前文件大小发送为起始字节。 例如,您使用 Range 标头请求字节 0-2000000。然后,您使用from pathlib import Path; path = Path(..); print(path.stat().st_size 检查文件大小,它返回 2000001 字节。您可以将此数字用于 Range 标头,以请求从 2000001-... 开始的下一部分。 如注:[1] 如果已经有带有ab 的打开文件,只需将f.tell() 用作resume_byte_pos。 [2] 如果在上面发送Range: bytes=,它可能会响应不同的标题,所以请注意(在我的情况下,Content-Length 如果我发送这个,则我需要将Content-Range 解析为进度条使用的总长度)。

以上是关于如何在 Python 中恢复文件下载?的主要内容,如果未能解决你的问题,请参考以下文章

永久删除文件后如何恢复文件

在 python 中构建 MIDI 合并程序,带有恢复选项

如何在 Linux 中恢复已删除的文件-

文件误删如何恢复

如何恢复已删除的文件?

如何在ios中恢复大文件的下载