为什么要在python请求中使用iter_content和chunk_size

And*_*ane 4 python chunks python-requests

我为什么要使用iter_content,特别是我对使用chunk_size的用途感到非常困惑,因为我尝试过使用它,并且在下载成功后似乎以各种方式保存了文件。

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

with open('c:/users/andriken/desktop/tiger.jpg', 'wb') as sav:
    for chunk in g.iter_content(chunk_size=1000000):
        print (chunk)
        sav.write(chunk)
Run Code Online (Sandbox Code Playgroud)

帮助我了解的用法,iter_content当您看到将1000000字节用作时chunk_size,会发生什么,确切的目的和结果是什么?

cow*_*ert 8

这是为了防止将整个响应立即加载到内存中(它还允许您在流式传输响应时实现一些并发性,以便可以在等待请求完成时进行工作)。

设置流请求的目的通常是针对媒体。就像尝试使用请求下载500 MB的.mp4文件一样,您想要流式传输响应(并将流以块形式写入chunk_size),而不是等待立即将所有500mb加载到python中。

如果要实现任何UI反馈(例如“下载的<chunk_size>字节...”之类的下载进度),则需要流式处理和分块处理。如果您的响应包含一个Content-Size标头,则您也可以计算每个保存的块的完成百分比。

  • 通常,如果不使用 `stream=True`,`.get() 返回的 [Response](http://docs.python-requests.org/en/master/api/#requests.Response) 对象` 在 `Response.content` 中保存了实际的、完整的响应内容。但是如果你正在流式传输,`.content` 的行为显然需要改变(它不能保存所有数据),你使用 `iter_content` 方法从服务器获取后续数据块到 `.content`并将其归还。这遵循典型的 python [迭代器](https://wiki.python.org/moin/Iterator) 模式。 (2认同)

ama*_*ets 6

文档中 chunk_size可以看出数据的大小,当stream=True.

例如,如果响应的大小为 1000 并chunk_size设置为 100,我们将响应分成十个块。