首页 > 解决方案 > 为什么使用map关闭多个文件时close方法未知?

问题描述

我有一个类似于以下的用例:

files = [open("foo1.pdf", "rb"), open("foo2.pdf", "rb"), open("foo3.pdf", "rb")]
# ... extract portions from the opened files using PyPDF2 and assemble a new PDF file
map(close, files)

为什么我在上面这样做?因为在使用 PyPDF2 将多个输入 PDF 文件合并到另一个文件中时,如果您关闭每个输入 PDF,您会在输出 PDF 中获得空白页面。输入文件必须保持打开状态,直到生成输出 PDF 文件,请参阅https://github.com/mstamy2/PyPDF2/issues/293

导致以下错误:

NameError: name 'close' is not defined

以下工作,但我想要不那么冗长的代码变体:

map(lambda file: file.close(), files)

我当然更喜欢以下内容:

map(close, files)

标签: python

解决方案


因为closeis 本身不是一个函数,不像open. 相反,它是类文件对象的方法。

如果你想以编程方式关闭文件,你可以close使用对象本身来调用。

for x in files:
    x.close()

如果您绝对想使用map,您可以使用 lambda 函数来执行此操作,但我建议不要这样做,因为map它定义了一个生成器,因此用户不清楚哪些文件已关闭,哪些文件已打开。

map(lambda x: x.close(), files)

推荐阅读