Python aiobotocore 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

我想使用botocore和aiohttp服务在S3上获取上传文件的内容。由于文件的大小可能很大:

  • 我不想将整个文件内容存储在内存中
  • 我希望能够在从S3下载文件时处理其他请求(aiobotocore,aiohttp)
  • 我希望能够对下载的文件进行修改,因此我希望逐行处理,并将响应流式传输到客户端
目前,我的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()


谢谢,这正是我需要的。