返回生成器时,应该如何处理文件句柄?

2024-03-29 07:04:16 发布

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

我的代码中有这个函数:

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

这将使文件无限期地打开,这不是好的做法。生成器用完时如何关闭文件?我想我可以用yield语句将生成器表达式展开为for循环,然后关闭文件。不过,我正在尝试尽可能多地使用函数式编程(只是作为一种学习练习)。有别的方法吗


Tags: 文件函数代码inreforreturndef
1条回答
网友
1楼 · 发布于 2024-03-29 07:04:16

使用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)

相关问题 更多 >