如何在Python3中将异步生成器流转换为类似文件的对象?

如何在Python3中将异步生成器流转换为类似文件的对象?,python,python-3.x,async-await,stream,python-asyncio,Python,Python 3.x,Async Await,Stream,Python Asyncio,因此,我制作了一个webservice(基于starlette),其端点接受二进制体。我想把这个二进制体输入fastavro ,我可以使用request.stream()以异步流的形式访问原始数据 现在,我想把这条流注入fastavro。问题是,需要一个类似文件的输入流: with open('some-file.avro', 'rb') as fo: avro_reader = reader(fo) 我的问题是,有没有一种干净的方法可以将这个异步流转换成类似的文件 我想我可以实现一个

因此,我制作了一个webservice(基于starlette),其端点接受二进制体。我想把这个二进制体输入fastavro

,我可以使用
request.stream()
以异步流的形式访问原始数据

现在,我想把这条流注入fastavro。问题是,需要一个类似文件的输入流:

with open('some-file.avro', 'rb') as fo:
    avro_reader = reader(fo)
我的问题是,有没有一种干净的方法可以将这个异步流转换成类似的文件

我想我可以实现一个对象,它有一个read()方法等待并返回request.stream返回的数据。但是如果调用方传递了一个大小,我需要一个内存缓冲区,不是吗?基于BufferedRpair的东西可以吗

或者,将整个流先存储到磁盘或内存,然后再将其馈送到fastavro,这是唯一的方法吗


提前谢谢

我最终使用了一个假脱机临时文件:

data_file = SpooledTemporaryFile(mode='w+b',
        max_size=MAX_RECEIVED_DATA_MEMORY_SIZE)
async for chunk in request.stream():
    data_file.write(chunk)
data_file.seek(0)
avro_reader = reader(data_file)

这不是我设想的理想解决方案(以某种方式在输入和输出之间直接传输数据),但仍然足够好…

在使用with block的
上下文管理器中,您不会将文件作为流来读取,它只是为了方便处理打开和关闭输入流。@JayVasant,的确,我写了stream,因为它是两个文档中使用的单词;但仅生成器(用于输入)和类似文件的对象(用于输出)更合适
data_file = SpooledTemporaryFile(mode='w+b',
        max_size=MAX_RECEIVED_DATA_MEMORY_SIZE)
async for chunk in request.stream():
    data_file.write(chunk)
data_file.seek(0)
avro_reader = reader(data_file)