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

如何在Python 3.5中恢复文件下载?,python,python-3.x,python-requests,python-3.6,python-3.5,Python,Python 3.x,Python Requests,Python 3.6,Python 3.5,我正在使用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.i

我正在使用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)

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

我认为
请求
没有内置此功能,但您可以非常轻松地手动完成(只要服务器支持)

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

Range: bytes=12345-
然后您可以将结果附加到文件中


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

Content-Range: bytes 12345-123456/123456
Content-Length: 111112
您还可能需要预先验证服务器是否处理范围。您可以通过查看初始响应中的标题,或通过执行
标题
,检查以下内容:

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

还可以检查
内容长度
,以确认您在被中断之前没有完成整个文件


因此,代码应该是这样的:

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就是您想要开始的地方。

我查看了它,但我无法理解。如果服务器支持
范围
功能,则可以仅使用
请求
恢复下载,但是,如果您希望可靠地下载文件并检查完整性,那么这并不是一件小事。如果您发现自己编写的下载代码太低,请检查此项目。编写下载管理器类型软件的人的一个常见错误是试图跟踪在以前的请求中读取了多少。不要这样做,只要用文件本身告诉你你有多少。如果使用多个线程下载文件,则此操作将不起作用