Python 如何从多个项目的缓冲区中生成单个项目,并定期重新填充缓冲区?
我有一个很大的数据源,我从中逐块提取数据。Python 如何从多个项目的缓冲区中生成单个项目,并定期重新填充缓冲区?,python,queue,generator,Python,Queue,Generator,我有一个很大的数据源,我从中逐块提取数据。 我不想返回chunksize项的块,而是想通过生成器生成单个项,一旦生成了块中的所有数据,我就想加载下一个块。 目标是一次返回一个项目,而不加载完整的数据源,也不从数据源中逐个提取项目 下面是一些伪代码: def get_data_chunk(数据源,chunksize=10): #获取数据源的chunksize元素 返回数据块(通常是dict的列表) def生成器(数据源): 数据块=获取数据块(数据源) 对于数据块中的项: 收益项目 #如果数据块中
我不想返回
chunksize
项的块,而是想通过生成器生成单个项,一旦生成了块中的所有数据,我就想加载下一个块。目标是一次返回一个项目,而不加载完整的数据源,也不从数据源中逐个提取项目 下面是一些伪代码:
def get_data_chunk(数据源,chunksize=10):
#获取数据源的chunksize元素
返回数据块(通常是dict的列表)
def生成器(数据源):
数据块=获取数据块(数据源)
对于数据块中的项:
收益项目
#如果数据块中没有更多项,请从获取数据块重新加载
#直到数据源不返回任何内容
我尝试使用一个队列,一旦该队列清空,我就会重新填充,但没有成功。您有两个选择:
while True:
循环并在下一个区块为空时退出:
def generator(datasource):
while True:
data_chunk = get_data_chunk(datasource)
if not data_chunk:
return
for item in data_chunk:
yield item
for
循环中使用的两个参数形式:
def generator(datasource):
for data_chunk in iter(lambda: get_data_chunk(datasource), None):
for item in data_chunk:
yield item
或者,使用:
None
,但如果它是一个空列表,则需要将None
替换为[]
演示:
from itertools import chain
def generator(datasource):
chunk_iter = iter(lambda: get_data_chunk(datasource), None)
yield from chain.from_iterable(chunk_iter)
>>> from itertools import chain, islice
>>> from random import randrange
>>> demosource = (randrange(11, 81) for _ in range(17))
>>> def get_data_chunk(datasource, chunksize=10):
... return list(islice(datasource, chunksize))
...
>>> def generator(datasource):
... chunk_iter = iter(lambda: get_data_chunk(datasource), []) # last chuck is an empty list
... yield from chain.from_iterable(chunk_iter)
...
>>> list(generator(demosource))
[38, 47, 74, 13, 23, 24, 47, 61, 30, 38, 70, 41, 43, 47, 37, 34, 67]