用一个表达式读取文件,正确关闭它们

问题描述 投票:0回答:3

我想在python中读取文件列表的内容。我的第一个想法是

contents = [open(f).read() for f in files]

但是这会使文件打开,直到对象被垃圾回收为止,并显示ResourceWarning

关闭文件需要多种理解:

fds = [open(f) for f in files]
contents = [fd.read() for fd in fds]
[fd.close() for fd in fds]

...这是不自然的。

或循环:

contents = []
for f in files:
    with open(f) as fd:
        contents.append(f.read())

...这很冗长,而且很容易阅读。

还有其他选择吗?

python file expression list-comprehension contextmanager
3个回答
1
投票

您可以使用pathlib

from pathlib import Path
contents_text = [Path(f).read_text() for f in files]
contents_bytes = [Path(f).read_bytes() for f in files]

0
投票

您可以使用功能:

def read_contents(filename):
    with open(filename) as file:
        return file.read()

contents = [read_contents(f) for f in files]

0
投票

您可以使用ExitStack上下文管理器。您的用例与文档中显示的示例略有不同。

from contextlib import ExitStack

with ExitStack() as es:
    contents = [es.enter_context(open(f)).read() for f in files]
© www.soinside.com 2019 - 2024. All rights reserved.