Requests真是个不错的图书馆.我想用它下载大文件(>1 GB). 问题是不可能将整个文件保存在内存中;我需要分块读取.这是以下代码的问题:

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 

出于某种原因,它不能这样工作:它仍然会在将响应保存到文件之前将其加载到内存中.

UPDATE

如果你需要一个可以从FTP下载大文件的小客户端(Python2.x/3.x),你可以找到here个.它支持多线程&重新连接(它会监视连接)并为下载任务调整套接字参数.

推荐答案

使用以下流代码,无论下载文件的大小如何,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-workflowResponse.iter_content.

Python相关问答推荐

我可以使用极点优化这个面向cpu的pandas代码吗?

每个组每第n行就有Pandas

telegram 机器人API setMyName不起作用

pandas DataFrame中类型转换混乱

如何将带有逗号分隔的数字的字符串解析为int Array?

Python中是否有方法从公共域检索搜索结果

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

如何从FDaGrid实例中删除某些函数?

如何在Python中使用io.BytesIO写入现有缓冲区?

使用LineConnection动画1D数据

@Property方法上的inspect.getmembers出现意外行为,引发异常

沿着数组中的轴计算真实条目

将两只Pandas rame乘以指数

使用groupby Pandas的一些操作

如何从pandas的rame类继承并使用filepath实例化

Pre—Commit MyPy无法禁用非错误消息

计算天数

如何排除prefecture_related中查询集为空的实例?

Python Pandas—时间序列—时间戳缺失时间精确在00:00

提高算法效率的策略?