10

这应该是一个非常简单的问题,我无法通过 Google 搜索找到答案:How to close file handle opens by pyPDF "PdfFileReader" Class

这是片段:

import os.path
from pyPdf import PdfFileReader

fname = 'my.pdf'
input = PdfFileReader(file(fname, "rb"))

os.rename(fname, 'my_renamed.pdf')

这会引发错误 [32]

谢谢

4

4 回答 4

6

操作系统正在阻止文件在其他东西打开时被重命名。这是一件好事(tm)。

Python 的with语句将在您完成读取/操作后自动关闭文件。

with open(fname, "rb") as f:
  input = PdfFileReader(f, "rb"))

os.rename(fname, 'my_renamed.pdf')

如果您仍在使用 Python 2.5,则必须进行特殊导入:

from __future__ import with_statement

Python 2.6 及以上版本默认启用 with。

于 2012-02-20T04:39:21.390 回答
4

如果您确实必须从 PdfFileReader 对象访问它(即:如果您自己没有对文件对象的引用),您可以使用reader.stream.close()

请注意,PdfFileReader 将需要一个打开的文件对象来访问 pdf 的内容(它不会从一开始就将所有内容都拉入内存),因此只有在阅读器完成后才关闭文件。

于 2012-02-20T15:24:14.343 回答
1

我建议处理从 PdfFileReader 打开的文件

您的代码将是:

import os.path
from pyPdf import PdfFileReader

fname = 'my.pdf'
fh = file(fname, "rb")
input = PdfFileReader(fh)

fh.close()
os.rename(fname, 'my_renamed.pdf')
于 2013-02-20T11:32:45.737 回答
0

而是使用input=PdfFileReader(file(fname, "rb")) 创建这样的输入流

inputStream=file(fname, "rb")
    input=PdfFileReader(inputStream)

当工作完成inputStream.close() 后,你将能够通过 os 包调用它

于 2015-04-03T12:12:43.100 回答