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 数据下载到本地变量,以便在写入磁盘之前可以对其进行一些操作/过滤,但我不确定在分块下载响应时如何实现这一点。
谁能建议如何做到这一点?谢谢。
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)
(我避免将块连接起来,+因为这会导致二次运行时间。)
| 归档时间: |
|
| 查看次数: |
1944 次 |
| 最近记录: |