首页 > 解决方案 > ValueError:寻找关闭的文件在 PyPDF2 上工作并收到此错误

问题描述

我正在尝试从 pdf 文件中获取文本。下面是代码:

from PyPDF2 import PdfFileReader
with open('HTTP_Book.pdf', 'rb') as file:
    pdf = PdfFileReader(file)

page = pdf.getPage(1)
#print(dir(page))
print(page.extractText())

这给了我错误

ValueError: seek of closed file

我只是将代码放在with语句下,它工作正常。我的问题是:为什么会这样?我已经将信息存储在“pdf”对象中,所以我应该能够在块外访问它。

标签: pythonpython-3.xpypdf2

解决方案


PdfFileReader期待一个可寻找的,开放的,蒸汽。它不会将整个文件加载到内存中,因此您必须保持打开状态才能运行方法,例如getPage. 您创建阅读器会自动读取整个文件的假设是不正确的。

with语句对上下文管理器(例如文件)进行操作。当with结束时,上下文管理器的__exit__方法被调用。PdfFildReader在这种情况下,它会关闭您试图用来获取第二页的文件句柄。

正如您所发现的,正确的程序是在关闭文件之前从 PDF 中阅读您必须阅读的内容。当且仅当您的程序需要打开 PDF 直到最后,您可以将文件名直接传递给PdfFileReader. 此后没有(记录的)方法可以关闭文件,因此我建议您使用原始方法:

from PyPDF2 import PdfFileReader
with open('HTTP_Book.pdf', 'rb') as file:
    pdf = PdfFileReader(file)
    page = pdf.getPage(1)
    print(page.extractText())
# file is closed here, pdf will no longer do its job

推荐阅读