如何关闭pyPDF中的“PdfFileReader”类文件句柄

12

这应该是一个非常简单的问题,但我在谷歌搜索中找不到答案:如何关闭由pyPDF “PdfFileReader”类打开的文件句柄?

以下是代码片段:

import os.path
from pyPdf import PdfFileReader

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

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

这会引发一个错误 [32]

谢谢


你是否在运行Windows系统,并且在重命名之前my_renamed.pdf文件已经存在? - khachik
是的,我忘了提到我使用 Windows 7 32 位和 Python 2.5。文件 'my_renamed.pdf' 不存在。 - romor
@romor 32 表示无法访问文件,因为它正在使用中。尝试在读取完 fname 后手动关闭它,然后进行重命名。 - khachik
是的,那是我的问题 - 如何关闭文件 :) - romor
10
fd = file(fname, 'rb'); input = PdfFileReader(fd); "read it here"; fd.close(); os.rename(...)打开名为fname的文件,'rb'代表以二进制读取模式打开;使用PdfFileReader函数读取文件内容;"read it here"表示在此处读取文件内容;关闭文件句柄fd;使用os.rename(...)对文件进行重命名操作。 - khachik
显示剩余2条评论
4个回答

7

当其他进程占用一个文件时,操作系统会阻止对该文件进行重新命名。这是一件好事。

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语句。


嗨,@fitzgeraldsteele。我喜欢这个答案,但是input = PdfFileReader(f, "rb"))多了一个右括号。应该是input = PdfFileReader(f, "rb") - Love and peace - Joe Codeswell
已修复。这个答案已经存在了10多年,没有人注意到,所以谢谢。 :) - fitzgeraldsteele

4

如果你真的必须从PdfFileReader对象中访问它(也就是说:如果你没有自己的文件对象的引用),你可以使用reader.stream.close()

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


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')

0

不要使用 input=PdfFileReader(file(fname, "rb")),而是像这样创建一个输入流

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

当任务完成后,请使用inputStream.close(),然后您就可以通过os包调用它了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接