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

在Python中使用请求库时,流式传输到变量而不是文件,python,python-requests,Python,Python Requests,我使用Python的请求包从远程服务器下载数据。之前我只是一次下载整个响应,如下所示: response = requests.get(url=endpoint, headers={'Authorization': 'Bearer ' + access_token, 'Content-type': 'application/json'}

我使用Python的请求包从远程服务器下载数据。之前我只是一次下载整个响应,如下所示:

response = requests.get(url=endpoint,
                        headers={'Authorization': 'Bearer ' + access_token,
                                 'Content-type': 'application/json'}
                        )
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')
然后使用response.json()方法访问数据:

然而,由于一些请求发回了相当多的数据,需要几分钟才能下载,所以我被要求为每个请求实现一个进度条,以便用户可以监控正在发生的事情。这里的关键似乎是在发送GET请求时使用stream=True选项:

response = requests.get(url=endpoint,
                        headers={'Authorization': 'Bearer ' + access_token,
                                 'Content-type': 'application/json'},
                        stream=True)
然后将数据分块下载,如下所示:

response = requests.get(url=endpoint,
                        headers={'Authorization': 'Bearer ' + access_token,
                                 'Content-type': 'application/json'}
                        )
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')
我遇到的问题是,我找到的所有使用response.iter_content()的示例在下载时都会将每个块直接写入一个文件(如上面的示例所示)。实际上,我需要将JSON数据下载到一个局部变量中,以便在写入磁盘之前对其进行操作/过滤,但我不确定在分块下载响应时如何实现这一点


有人能建议怎么做吗?谢谢。

回复。iter\U内容将为您提供块。你可以对他们做任何你想做的事。您不必将它们写入文件

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

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)

(我避免将块与
+
连接,因为这样会导致二次运行。)

您是否尝试过:1)先将文件下载到本地文件系统2)读取文件并执行所需操作3)再次将文件保存到磁盘?我知道这是一个有点笨拙的解决方案,但应该是可行的,这基本上是我的备份计划。。。但我只是在寻找一个更优雅的解决方案,它不涉及临时文件。你可以使用,它至少会为你节省磁盘I/O。@Ben我明白了。以防万一-如果目标操作系统是Linux,文件可能只是RAM中的某个东西,不一定是HDD或SSD,所以它可能非常高效,工作非常出色,谢谢。现在看来很明显。。。我用reports=json.loads(full_content)[data']['report']修改了您解析的_data=json.loads(full_content)行,并使用旧方法准确地返回了数据结构。