使用 Python 从异步 HTTP 请求保存 gzip 文件

Saving gzip file from Async HTTP request with Python

我正在尝试从 API 异步响应中保存一堆 gzip 文件。基本上,我得到一个具有不同 URI 的数组,我必须将它们附加到基 URL 才能下载 .gz 文件。在 .gz 文件中是一个格式为 JSON 的文本文件。我已经有以同步方式工作的代码,但我想尝试异步以最小化运行时间。我在下面尝试了一种异步方式,这确实给了我 .gz 文件,但是当我尝试提取这些文件时,它们中什么也没有。非常感谢任何帮助或想法!

这是同步代码:

from get_countryfile import uri_response, request_url
import requests
import os
import pathlib

access_token = get_access_token()

print(access_token)
for uri in uri_response:
    request_url = request_url + uri['uri'] + '?access_token=' + access_token
    request = requests.get(request_url)
    with open('filename' + uri['description'] + '.json.gzip', 'wb') as myfile:
        myfile.write(request._content)

这是我目前的异步代码:

from get_access_token import get_access_token
from get_countryfile import uri_response, request_url
import aiohttp
import aiofiles
import asyncio
import gzip

async def get_file():

    async with aiohttp.ClientSession() as session:

        for uri in uri_response:
            file_url = request_url + uri['uri']+'?access_token='+ get_access_token()
            async with session.get(file_url) as resp:
                with open('filename' + uri['description'] + '.json.gzip', 'w') as myfile:
                    print(resp.read())
                    
asyncio.run(get_file())

看看异步 for 循环,它是更新的 Python 3 版本中的内置构造。

看这里:https://quentin.pradet.me/blog/using-asynchronous-for-loops-in-python.html

您缺少等待。 resp.read() 方法是异步的。要在其他函数中使用 运行 异步函数,我们需要使用 await <function>.

from get_access_token import get_access_token
from get_countryfile import uri_response, request_url
import aiohttp
import aiofiles
import asyncio
import gzip

async def get_file():

    async with aiohttp.ClientSession() as session:

        for uri in uri_response:
            file_url = request_url + uri['uri']+'?access_token='+ get_access_token()
            async with session.get(file_url) as resp:
                with open('filename' + uri['description'] + '.json.gzip', 'w') as myfile:
                    print(await resp.read())
                    
asyncio.run(get_file())