在 Python 中使用 requests 库时流式传输到变量而不是文件

Ben*_*Ben 6 python python-requests

我正在使用 Python 的requests包从远程服务器下载数据。以前我只是一次性下载整个回复,如下所示:

response = requests.get(url=endpoint,
                        headers={'Authorization': 'Bearer ' + access_token,
                                 'Content-type': 'application/json'}
                        )
Run Code Online (Sandbox Code Playgroud)

然后使用response.json()方法访问数据:

reports = response.json()['data']['report']
Run Code Online (Sandbox Code Playgroud)

然而,由于某些请求发回大量数据,需要长达几分钟的时间才能下载,因此我被要求为每个请求实现一个进度栏,以便用户可以监控正在发生的情况。这里的关键似乎是在发送 GET 请求时使用stream=True选项:

response = requests.get(url=endpoint,
                        headers={'Authorization': 'Bearer ' + access_token,
                                 'Content-type': 'application/json'},
                        stream=True)
Run Code Online (Sandbox Code Playgroud)

然后像这样分块下载数据:

with open('output_file', 'wb') as f:
    for chunk in response.iter_content(chunk_size=4096):
        f.write(chunk)
        # print download progress based on chunk size and response.headers.get('content-length')
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,我发现使用response.iter_content() 的所有示例在下载时都会将每个块直接写入文件(如上面的示例所示)。实际上,我需要将 JSON 数据下载到本地变量,以便在写入磁盘之前可以对其进行一些操作/过滤,但我不确定在分块下载响应时如何实现这一点。

谁能建议如何做到这一点?谢谢。

use*_*ica 4

response.iter_content给你块。你可以对它们做任何你想做的事。您不必将它们写入文件。

例如,您可以将它们放在一个列表中,然后将它们放在一起并在最后解析结果:

import json

chunks = []
for chunk in response.iter_content(chunk_size=4096):
    chunks.append(chunk)
    do_progress_bar_stuff()

full_content = b''.join(chunks)
parsed_data = json.loads(full_content)
do_stuff_with(parsed_data)
Run Code Online (Sandbox Code Playgroud)

(我避免将块连接起来,+因为这会导致二次运行时间。)