通过多个过滤的生成器使用单个生成器

2024-09-27 01:24:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

>uniqueid#BARCODE1
content content
content content
>uniqueid#BARCODE2
content content
content content
>uniqueid#BARCODE1
content content
content content
...

共有约1000万条记录,包含约300个唯一的条形码,条形码的顺序是随机的。我的目标是将文件拆分为300个文件。我只想用一个生成记录的生成器对文件进行一次遍历

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

是否可以实例化300个生成器,并使用一些逻辑将记录发送到正确的生成器?然后我可以简单地将每个生成器的内容写入一个文件。然后,我是否需要打开所有300个文件的句柄,以便一次写入


Tags: 文件实例方法内存内容目标顺序记录
1条回答
网友
1楼 · 发布于 2024-09-27 01:24:19

是的,可以用发电机,但我们不需要300台,一台就足够了

据我所知'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
    

相关问题 更多 >

    热门问题