当前位置: 首页 > 知识库问答 >
问题:

如何恢复文件下载在Python 3.5?[重复]

百里杰
2023-03-14

我正在使用Python3.5请求模块下载一个文件,使用下面的代码,如何使这段代码“自动恢复”从部分下载的文件下载。

response = requests.get(url, stream=True)

total_size = int(response.headers.get('content-length'))  

with open(file_path + file_name, "wb") as file:
    for data in tqdm(iterable = response.iter_content(chunk_size = 1024), total = total_size//1024, unit = 'KB'):
        file.write(data)

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

共有1个答案

潘佐
2023-03-14

我不认为请求内置了这个功能,但是您可以很容易地手动完成它(只要服务器支持它)。

关键是范围请求。要获取从字节12345开始的部分资源,请添加以下标头:

Range: bytes=12345-

然后您可以将结果附加到您的文件中。

理想情况下,您应该验证返回的是206部分内容,而不是200,并且标题包含您想要的范围:

Content-Range: bytes 12345-123456/123456
Content-Length: 111112

您还可能希望预先验证服务器是否处理范围。您可以通过查看初始响应中的标头来实现这一点,或者通过执行HEAD来检查以下内容:

Accept-Ranges: bytes

如果标头完全丢失,或具有none作为值,或具有不包含字节的值列表,则服务器不支持恢复。

还可以检查Content-L长度,以验证您在中断之前是否已经完成了整个文件。

所以,代码看起来像这样:

def fetch_or_resume(url, filename):
    with open(filename, 'ab') as f:
        headers = {}
        pos = f.tell()
        if pos:
            headers['Range'] = f'bytes={pos}-'
        response = requests.get(url, headers=headers, stream=True)
        if pos:
            validate_as_paranoid_as_you_want_to_be_(pos, response)
        total_size = int(response.headers.get('content-length'))  
        for data in tqdm(iterable = response.iter_content(chunk_size = 1024), total = total_size//1024, unit = 'KB'):
            file.write(data)

编写下载管理器类型软件的人的一个常见错误是试图跟踪以前的请求中读取了多少。不要这样做,只是用文件本身告诉你你有多少。毕竟,如果您读取了23456个字节,但只将12345刷新到文件中,则需要从12345开始。

 类似资料:
  • 问题内容: 我正在使用python 2.7请求模块使用以下代码下载二进制文件,如何使此代码从部分下载的文件中“自动恢复”下载。 如果可能的话,我宁愿只使用模块来实现这一目标。 问题答案: 如果Web服务器支持范围请求,则可以将Range标头添加到您的请求中: 您将收到StartPos和StopPos之间的部分。如果不知道StopPos,请使用: 因此您的代码将是:

  • 问题内容: 在这段代码中,我尝试恢复下载。目标文件为20MB。但是,当我停止在10mb上下载时,然后遇到麻烦,我得到的文件大小为30MB。似乎它继续写入文件,但不能部分从服务器下载。Wget -c非常适合该文件。如何恢复文件下载? 问题答案: 这不是我的代码,但是可以。

  • 问题内容: 我正在尝试在下载管理器中实现暂停/恢复,我在网上搜索并阅读了几篇文章,并根据它们更改了我的代码,但是恢复似乎无法正常工作,有什么想法吗? 问题答案: 好的问题已解决,这是我的其他想要实现暂停/恢复的用户的代码:

  • 问题内容: 我正在尝试从Yahoo!下载大文件!如果没有在100秒之内完成下载,显然是由(不是我)设置的网站服务器断开下载。该文件足够小,通常可以成功传输。在数据速率很慢并且下载被断开的情况下,是否有办法在断开连接发生的文件偏移处恢复URLConnection?这是代码: 问题答案: 尝试使用“范围”请求标头: 完成此操作后,您可以在给定的位置(例如,在下载数据的长度之前)开始在此处写入新下载的数

  • 问题内容: 我编写了一个程序,可以从某些服务器下载一些文件。 当前程序正常运行。 但我想为其添加简历支持。 我正在这样做,但结果文件已损坏: 我正在我知道支持简历的服务器上对其进行测试。 我下载了一些字节。(72720) 然后尝试恢复它。 然后,我使用Hex编辑器打开文件,在偏移量72720处,重复第一个字节: 字节0-36:FLV .............«..... onMetaData 字

  • 我的项目运行正常。我只是做了一次Lint检查,它给了我所有项目的错误。所以我刚刚清理了我的项目。但现在它并没有生成R.java文件。我怎样才能找回它。我试着建造。。但它不起作用