通过多个过滤的生成器消耗单个生成器

时间:2017-06-07 15:21:37

标签: python generator

我有一个包含如下所示记录的文件:

t.test(age ~ gender, data=df, alternative='two.sided')

有大约1000万条记录,其中包含约300个独特的条形码,条形码的顺序是随机的。我的目标是将文件拆分为300个文件。我想通过生成记录的生成器只传递一次文件。

我过去通过多次读取文件或将整个文件加载到内存中解决了这个问题。我想使用生成器方法来解决问题,以减少内存使用量,并且只读取文件一次。

是否可以实例化300个生成器,并有一些逻辑将记录分派给正确的生成器?然后我可以简单地将每个生成器的内容写出到文件中。那么我是否需要对我想要一次写入的所有300个文件打开句柄?

1 个答案:

答案 0 :(得分:1)

是的,它可以用发电机完成,但我们不需要300个,只需1个即可。

据我了解'uniqueid#BARCODE1'条形码由两部分组成:

  • '>uniqueid#'前缀,
  • 'BARCODE1'条形码本身。

所以让我们开始编写简单的检查器

BAR_CODE_PREFIX = '>uniqueid#'


def is_bar_code(text):
    return text.startswith(BAR_CODE_PREFIX)

然后,为了解析条形码内容,我们可以编写生成器

def parse_content(lines):
    lines_iterator = iter(lines)
    # we assume that the first line is a barcode
    bar_code = next(lines_iterator)
    contents = []
    for line in lines_iterator:
        if is_bar_code(line):
            # next barcode is found
            yield bar_code, contents
            bar_code = line
            contents = []
        else:
            contents.append(line)
    # to yield last barcode with its contents
    yield bar_code, contents

然后假设你想在我们可以写的条形码之后命名文件

def split_src(src_path):
    with open(src_path) as src_file:
        for bar_code, content_lines in parse_content(src_file):
            bar_code_index = bar_code[len(BAR_CODE_PREFIX):].rstrip('\n')
            # we use `append` mode
            # because in the different parts of file 
            # there are contents of the same barcode
            with open(bar_code_index, mode='a') as dst_file:
                dst_file.writelines(content_lines)

在整个档案中走了一次。

测试

让我们创建一个由

组成的src.txt文件
>uniqueid#BARCODE1
content11
>uniqueid#BARCODE2
content21
>uniqueid#BARCODE1
content12
content12
>uniqueid#BARCODE3
content31
>uniqueid#BARCODE2
content22

然后调用

split_src('src.txt')

将会创建下一个文件:

  • BARCODE1

    content11
    content12
    content12
    
  • BARCODE2

    content21
    content22
    
  • BARCODE3

    content31