小编典典

使用请求在python中下载大文件

all

Requests是一个非常好的库。我想用它来下载大文件(>
1GB)。问题是不可能将整个文件保存在内存中。我需要分块阅读。这是以下代码的问题:

import requests

def DownloadFile(url)
    local_filename = url.split('/')[-1]
    r = requests.get(url)
    f = open(local_filename, 'wb')
    for chunk in r.iter_content(chunk_size=512 * 1024): 
        if chunk: # filter out keep-alive new chunks
            f.write(chunk)
    f.close()
    return

由于某种原因,它不能以这种方式工作:它仍然在将响应保存到文件之前将其加载到内存中。

更新

如果你需要一个可以从 FTP 下载大文件的小客户端(Python 2.x
/3.x),你可以在这里找到它。它支持多线程和重新连接(它确实监视连接),它还为下载任务调整套接字参数。


阅读 99

收藏
2022-03-11

共1个答案

小编典典

使用以下流式代码,无论下载文件的大小如何,Python 内存使用都会受到限制:

def download_file(url):
    local_filename = url.split('/')[-1]
    # NOTE the stream=True parameter below
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                # If you have chunk encoded response uncomment if
                # and set chunk_size parameter to None.
                #if chunk: 
                f.write(chunk)
    return local_filename

请注意,使用返回的字节数iter_content不完全是chunk_size; 预计它是一个通常更大的随机数,并且预计在每次迭代中都会有所不同。

请参阅body-content-
workflow
Response.iter_content以获取更多参考。

2022-03-11