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]