python - 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”对象中,所以我应该能够在块外访问它。
解决方案
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
推荐阅读
- sql-server - 为什么在尝试创建运行“更新数据库”的数据库时出现此错误?
- python-3.x - AttributeError:“WindowsPath”对象没有“告诉”属性
- python - Barcode Scanner python Opencv第二次执行时不打开网络摄像头
- pentaho - 尝试在pentaho数据集成中构建日志机制
- azure - Azure VM 核心大小
- git - Jenkins 作业拉取请求不会自动触发
- visual-studio-code - 更改 VSC Jupyter Notebook 输出的 mimetype
- pandas - 将文件夹中 tsv 的内容合并到数据框中
- sql - 如果第一次加入没有返回任何值,那么使用另一个
- machine-learning - 在 lua-ai 库中链接输入和输出