如何对可变数量的文件名列表使用列表理解?

How to use list comprehension with list of variable number of filenames?

给定文件名列表 filenames = [...]

是否可能重写 I/O-safety 的下一个列表理解:[do_smth(open(filename, 'rb').read()) for filename in filenames]?使用 with 语句、.close 方法或其他方法。

另一种问题表述:下一段代码是否可以写I/O-safe列表理解?

results = []
for filename in filenames:
   with open(filename, 'rb') as file:
      results.append(do_smth(file.read()))

您可以将 with statement/block 放入一个函数并在列表理解中调用它:

def slurp_file(filename):
    with open(filename, 'rb') as f:
        return f.read()

results = [do_smth(slurp_file(f)) for f in filenames]

您可以使用 Python 3.3 中引入的 ExitStack 来达到此目的:

with ExitStack() as stack:
    files = [stack.enter_context(open(name, "rb")) for name in filenames]
    results = [do_smth(file.read()) for file in files]

请注意,这会一次打开所有文件,这对于本用例来说不是必需的,如果您有大量文件,这可能不是一个好主意。