使用 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())
我正在尝试从 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())