Python aiobotocore aiohttp-获取S3文件内容并在响应中对其进行流式处理
我想使用botocore和aiohttp服务在S3上获取上传文件的内容。由于文件的大小可能很大:Python aiobotocore aiohttp-获取S3文件内容并在响应中对其进行流式处理,python,amazon-s3,aiohttp,botocore,Python,Amazon S3,Aiohttp,Botocore,我想使用botocore和aiohttp服务在S3上获取上传文件的内容。由于文件的大小可能很大: 我不想将整个文件内容存储在内存中 我希望能够在从S3下载文件时处理其他请求(aiobotocore,aiohttp) 我希望能够对下载的文件进行修改,因此我希望逐行处理,并将响应流式传输到客户端 目前,我的aiohttp处理程序中有以下代码: import asyncio import aiobotocore
- 我不想将整个文件内容存储在内存中
- 我希望能够在从S3下载文件时处理其他请求(aiobotocore,aiohttp)
- 我希望能够对下载的文件进行修改,因此我希望逐行处理,并将响应流式传输到客户端
import asyncio
import aiobotocore
from aiohttp import web
@asyncio.coroutine
def handle_get_file(loop):
session = aiobotocore.get_session(loop=loop)
client = session.create_client(
service_name="s3",
region_name="",
aws_secret_access_key="",
aws_access_key_id="",
endpoint_url="http://s3:5000"
)
response = yield from client.get_object(
Bucket="mybucket",
Key="key",
)
每次从给定文件中读取一行时,我都要发送响应。实际上,get_object()返回一个包含主体(ClientResponseContentProxy对象)的dict。使用read()方法,如何获取预期响应的一块并将其流式传输到客户端
当我这样做时:
for content in response['Body'].read(10):
print("----")
print(content)
result = yield from response['Body'].read(10)
循环中的代码永远不会执行
但当我这样做的时候:
for content in response['Body'].read(10):
print("----")
print(content)
result = yield from response['Body'].read(10)
我在结果中得到文件的内容。我对如何在这里使用read()有点困惑
谢谢这是因为
aiobotocore
api与botocore
不同,这里read()
返回一个FlowControlStreamReader.read
生成器,您需要从
看起来有点像(取自)
实际上,您甚至可以使用readline()
谢谢,这正是我需要的。