当我返回发电机时,我该如何处理文件句柄?

时间:2016-10-03 18:38:40

标签: python functional-programming generator

我的代码中有这个功能:

def load_fasta(filename):
    f = open(filename)
    return (seq.group(0) for seq in re.finditer(r">[^>]*", f.read()))

这将使文件无限期打开,这不是一个好习惯。生成器耗尽时如何关闭文件?我想我可以将生成器表达式扩展为带有yield语句的for循环,然后关闭文件。我尽可能经常尝试使用函数式编程(仅作为学习练习)。有没有不同的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

使用yield代替单个生成器表达式。

def load_fasta(filename):
    with open(filename) as f:
        for seq in re.finditer(r">[^>]*", f.read()):
            yield seq.group(0)

for thing in load_fasta(filename):
    ...

with语句将在for循环完成后关闭文件。请注意,由于您无论如何都要将整个文件读入内存,因此您只需使用

即可
def load_fasta(filename):
    with open(filename) as f:
        data = f.read()
    for seq in re.finditer(r">[^>]*", data):
        yield seq.group(0)